Linux單用戶CS模型TCP通訊完全註釋手冊

来源:https://www.cnblogs.com/yanlei2018/archive/2018/01/01/8168940.html
-Advertisement-
Play Games

Linux單用戶CS模型TCP通訊完全註釋手冊 server 描述 實現一個簡單的Linux單用戶CS通訊,客戶端發送一串字元串,伺服器將其轉換為大寫後返回。 server 代碼 運行效果 客戶端輸入:hello,world 服務端轉換為大寫後返回,客戶端收到伺服器發回的數據後進行列印:HELLO, ...


Linux單用戶CS模型TCP通訊完全註釋手冊

server

描述

  • 實現一個簡單的Linux單用戶CS通訊,客戶端發送一串字元串,伺服器將其轉換為大寫後返回。

server 代碼

```
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#define SERV_PORT 6666
int main(int argc,char *argv[])
{
    int sfd, cfd;//定義伺服器的文件描述符std, 定義客戶端的文件描述符cfd, cfd用來與客戶端通訊,sfd用來接受客戶端接入請求.
    int len, i;//定義讀取客戶端數據長度返回值len, 定義操作字元時的迴圈變數i
    char buf[BUFSIZ], clie_IP[BUFSIZ];//定義buf接收字元串, 定義clie_IP接收套接字中客戶端IP
    struct sockaddr_in serv_addr, clie_addr;//定義伺服器結構體,客戶端結構體
    socklen_t clie_addr_len;//定義客戶端套接字長度

    sfd = socket(AF_INET, SOCK_STREAM, 0);//創建一個伺服器套接字,返迴文件描述符

    bzero(&serv_addr, sizeof(serv_addr));//給結構體清零
    serv_addr.sin_family = AF_INET;//設置結構體協議族為IPv4
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//設置結構體IP為所有有效網卡的IP,這裡需要用htonl將INADDR_ANY轉為網路位元組序.
    serv_addr.sin_port = htons(SERV_PORT);//設置埠,這裡htons為轉為網路位元組序

    bind(sfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));//設置文件描述符與結構體綁定(ip, port, 網卡等).

    listen(sfd, 2);//參數2為半連接及已連接但在等待accept分配文件描述符的連接數的總和,Linux預設最大128(該值可修改)

    printf("Wait for client connect ...\n");

    while(1)
    {
        clie_addr_len= sizeof(clie_addr);//初始化客戶端結構體長度
        cfd = accept(sfd, (struct sockaddr *)&clie_addr, &clie_addr_len);//給客戶端連接分配文件描述符,並保存客戶端IP埠等信息到clie_addr結構體中
        printf("cfd = ----------%d\n", cfd);
        printf("client IP : %s, port : %d\n", /*列印客戶端IP,埠號,這裡從in_addr_t類型轉換到字元串類型,需要用inet_ntop函數*/
               inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)), 
               ntohs(clie_addr.sin_port)/*將埠號轉換為本地位元組序*/
              );
        do  //迴圈處理客戶端請求
        {
            len = read(cfd, buf, sizeof(buf));
            write(STDOUT_FILENO, buf, len);
            for(i = 0; i< len; ++i)
            {
                buf[i] = toupper(buf[i]);
            }
            write(cfd, buf, len);
        }while(len);
        close(cfd);//通訊結束,關閉客戶端文件描述符
    }
    close(sfd);//通訊結束,關閉伺服器文件描述符

    return 0;
}

```

client代碼實現

```
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666

int main(int argc,char *argv[])
{
    int sfd, len;//定義與server通訊的文件描述符sfd, 定義讀取到的數據(server發的)的長度len
    struct sockaddr_in serv_addr;//定義與server通訊的套接字serv_addr
    char buf[BUFSIZ];//定義buf接收server發送的數據

    sfd = socket(AF_INET, SOCK_STREAM, 0);//初始化文件描述符sfd,協議族為AF_INET(即IPv4), 應用協議為SOCK_STREAM(即TCP協議),第三個參數預設0

    bzero(&serv_addr, sizeof(serv_addr));//將套接字清零

    serv_addr.sin_family = AF_INET;//設置套接字協議族為IPv4
    inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);//將IP地址轉換為in_addr_t類型存入
    serv_addr.sin_port = htons(SERV_PORT);//將埠轉為網路位元組序存入

    connect(sfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));//按照套接字里伺服器信息連接伺服器,並設置sfd文件描述符用來通訊

    while(1)//與伺服器通訊過程,本例為給server發送一行數據,然後列印server發回的數據.
    {
        fgets(buf, sizeof(buf), stdin);
        int ret = write(sfd, buf, strlen(buf));
        printf("write ret = %d\n", ret);
        len = read(sfd, buf, sizeof(buf));
        printf("read len = %d\n", len);
        write(STDOUT_FILENO, buf, len);
    }

    close(sfd);//關閉文件描述符
	return 0;
}


```

運行效果

  • 客戶端輸入:hello,world
  • 服務端轉換為大寫後返回,客戶端收到伺服器發回的數據後進行列印:HELLO,WORLD

如圖

存在問題

  • 僅作學習建立TCP連接使用,不支持多用戶,未進行錯誤處理。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 匿名方法是C# 2.0引入的新特性,用來為委托實例綁定方法。 應用場景:需要為委托實例綁定一個專用方法的時候,這就意味著匿名方法不可以被其它委托實例顯式引用。 聲明語法:委托類型 變數名 = delegate ( 參數列表 ) { 代碼塊 }; 示例代碼: 示例代碼解讀: 代碼運行結果: >>Hel ...
  • 因為您可以用,並且也是您的最佳選擇!之所以可用,是因為 C# 能夠很好地在 Mac、Linux、Android 和 iOS 上運行(對了,還有 Windows);它可以在您最喜愛的編輯器上運行;它在一個穩定的企業級平臺上經過了充分的時間驗證;最為重要的是:它是完全開源的!之所以是您的最佳選擇,是因為 ...
  • 運行完畢後刪除自己: public class DelSelf { /// <summary> /// 刪除自身,只刪除Application對象所取得的文件 /// </summary> /// <param name="args">刪除延時必須大於0,也不需太長,太小可能導致刪不掉!請根據電腦 ...
  • 一、課程介紹 本次分享課程屬於《C#高級編程實戰技能開發寶典課程系列》中的第四部分,阿笨後續會計劃將實際項目中的一些比較實用的關於C#高級編程的技巧分享出來給大家進行學習,不斷的收集、整理和完善此系列課程!本高級系列課程適合人群如下: 1、有一定的NET開發基礎並對WebApi、Task、WebSo ...
  • 一、課程介紹 本次分享課程屬於《C#高級編程實戰技能開發寶典課程系列》中的第三部分,阿笨後續會計劃將實際項目中的一些比較實用的關於C#高級編程的技巧分享出來給大家進行學習,不斷的收集、整理和完善此系列課程!本次高級系列課程適合人群如下: 1、有一定的NET開發基礎並對Socket技術有一定瞭解和認識 ...
  • 併發(英文Concurrency),其實是一個很泛的概念,字面意思就是“同時做多件事”,不過方式有所不同。在.NET的世界裡面,處理高併發大致有以下幾種方法: 1,非同步編程 非同步編程就是使用future模式(又稱promise)或者回調機制來實現(Non-blocking on waiting)... ...
  • Linux多進程CS伺服器簡單實現 server端 多進程實現多用戶連接,即每個用戶一個連接,這裡仍然用server將收到的字元串轉大寫後返回給客戶端。 代碼實現 測試結果 可以實現多個客戶端同時連接伺服器,伺服器每接受一個客戶就創建一個子進程,用戶端斷開後,進程由父進程自動回收子進程。 存在問題 ...
  • linux驅動 alsa模型: Linux ALSA音效卡驅動之一:ALSA架構簡介 Linux ALSA音效卡驅動之二:音效卡的創建 Linux ALSA音效卡驅動之三:PCM設備的創建 Linux ALSA音效卡驅動之四:Control設備的創建 Linux ALSA音效卡驅動之五:移動設備中的ALSA(A ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...