關於Linux下C語言TCP的程式設計流程

2021-09-25 14:37:42 字數 2767 閱讀 3649

說到tcp,首先能想到的就是它面向連線、位元組流和可靠三個特點了。

使用tcp協議通訊的雙方必須先建立連線,然後才能開始資料的讀寫。本文就是主要講述,如何在linux下的乙個tcp程式設計流程。

首先先來說伺服器端的程式設計流程:

首先就是建立乙個socket套接字,然後將伺服器打的ip位址和使用的埠號與建立的socket套接字進行繫結,也將這一步也稱為命名套接字,然後讓核心啟動監聽與客戶端的連線,再用accept函式接受乙個在核心監聽下的連線,然後我們就可以進行讀寫操作了。

第一步建立乙個socket套接字

#include#includeint socket(int domain,int type,int protocol);
domain引數是用來告訴系統,我們用的是什麼底層協議。這裡對於tcp/ip協議族而言,這裡使用af_inet(ipv4) 或者af_inet6(ipv6)。

type引數是指定服務型別。服務型別主要位元組流服務(sock_stream)和資料報服務(sock_ugram)。對於tcp來說,使用的是位元組流服務(sock_stream)。

protoccol引數值得是在強兩個引數構成的乙個協議族集合下,選擇乙個更加具體的乙個協議,不過這個值一般都是唯一的,通常設定為0。

socket函式成功是會返回乙個socket檔案描述符,失敗則會返回-1。

第二步繫結套接字

#include#includeint res = bind(int socket,struct socketaddr* my_addr,socklen_t addrlen);
socket引數指的就是我們之間建立的那個socket套接字;

struct socketaddr* my_addr指的是我伺服器本身的乙個ip位址;在這我們得先看一下tcp/ip協議在linux下的乙個專有socket位址結構體;

struct socketaddr_in

struct in_addr

關於ipv6的乙個位址結構體就不在這裡進行展示了,可以使用linux下的man進行了解學習。

addrlen指的是socket的位址長度。

如果bind繫結成功,會返回0;如果是失敗,會返回-1;

在這有兩種最常見的錯誤1、繫結的埠是受保護的,沒有許可權訪問;2、繫結的埠正在使用中

第三部,監聽socket

#includeint listen(int socket,int backlog);
socket引數指的被監聽的socket;

backlog引數指的是核心監聽佇列的最大長度,這個的佇列包括兩部分第乙個佇列存放的是已建立連線的套接字(即完成三次握手後的),第二個佇列存放的是未建立連線的套接字(處在三次握手中的)。

listen成功時返回0,失敗則返回-1;

第四部accept從監聽佇列中接受乙個連線

#include#includeint accept(int socket,struct sockaddr *addr,socklen_t *addrlen);
socket 引數是指被監聽過的乙個socket。

addr引數指的是將要被連線的遠端socket位址;

addrlen引數指的socket位址的長度;

到這為止伺服器所用的幾個函式就介紹結束了,接下來介紹一下客戶端這邊的流程:

客戶端的流程:

先建立乙個socket,然後使用connect函式發起連線,然後就可以進行讀寫。

#include#includeint connect(int socket,const struct sockaddr *server_addr,socklen_t);
server_addr 指的是將要連線的伺服器裡,伺服器核心監聽的socket位址,也就是伺服器的ip

addrlen 指的是這個位址的長度

最後,伺服器和客戶端進行完連線後要關閉對應的socket,釋放資源;

int close(int fd);

接下來就是我寫的乙個簡單的伺服器客戶端的乙個**,以供參考:

伺服器:

#include#include#include#include#include#include#includeint main()

; int n = recv (c, buff,127,0);

printf("recv:%s ",buff);

if(n <= 0)

send(c,"ok",2,0);

} close(c);

} close(socketfd);

return 0;

}

客戶端:

#include#include#include#include#include#include#include#include#include#include//using namespace std;

int main()

; fgets(cmd,127,stdin);

if(strncmp(cmd,"end",3)== 0)

send(socketfd,cmd,sizeof(cmd),0);

char buff[128] = ;

recv(socketfd,buff,127,0);

prientf("%s",buff);

} close(socketfd);

return 0;

}

linux下c語言tcp通訊

tcp ip 協議組 應用層 ftp smtp http 傳輸層 tcp udp 網路層 ip icmp igmp 物理層 網路介面層 鏈路層 乙太網 令牌環網 fddi 例項 服務端 include include include include include include include i...

Linux下C語言程式設計 關於程序

摘抄網上的pdf檔案,有增改。一 五種狀態 1.新建 表示程序正在被建立。2.執行 表示程序正在執行。3.阻塞 程序正在等待某乙個事件發生。4.就緒 表示系統正在等待cpu來執行命令。5.完成 表示程序已經結束,系統正在 資源。二 getpid 可以得到程序 的id,getppid 可以得到父程序 ...

linux下C 實現TCP通訊

udp教程可以檢視 tcp通訊協議鏈結過程如下圖所示。由上圖可看出 tcp的伺服器需要bind listen accept tcp的客戶端需要connect 伺服器 如下 include include include include include include include include ...