利用網路套接字實現TCP互動

2021-08-19 20:22:24 字數 2816 閱讀 4371

我們來了解一下tcp互動流程:

大致流程如下:

(1)伺服器根據位址的型別(屬於ipv4還是ipv6等)、socket型別(比如tcp、udp)去建立socket,建立出的套接字socket本質上是個檔案描述符

(2)伺服器繫結ip位址和埠號到套接字socket

(3)伺服器socket**監聽**埠號請求,隨時準備接收客戶端發來的連線,但這個時候伺服器的socket並沒有被開啟。

(4)根據位址的型別(屬於ipv4還是ipv6等)、socket型別(比如tcp、udp)去**建立socke**t,建立出的套接字socket本質上也是個檔案描述符。

(5)客戶端根據伺服器的ip位址和埠號,試圖連線伺服器

(6)伺服器socket**接收到客戶端的socket請求,被動開啟,開始接收客戶端的請求並等待客戶端返回連線資訊。這個階段,伺服器的**accept方法是阻塞的,即等到剛才試圖連線的客戶端返回連線資訊,accept方法才能返回,才能繼續接收下乙個最新的客戶端連線請求。

(7)客戶端連線成功,向伺服器傳送連線狀態資訊

(8)伺服器accept方法返回,連線成功

(9)客戶端傳送訊息

(10)服務端接收訊息

(11)客戶端關閉

(12)服務端關閉

我們根據這個流程實現tcp互動:

tcpserver.c(伺服器)

#include 

#include

#include

#include

#include

#include

#include

#include

//伺服器

int main(int argc, char* argv)

//建立套接字

int sock = socket(af_inet, sock_stream, 0);

if(sock < 0)

struct sockaddr_in local;

local.sin_family = af_inet;

local.sin_port = htons(atoi(argv[2]));

local.sin_addr.s_addr = inet_addr(argv[1]);

//繫結

if(bind(sock, (struct sockaddr*)&local, sizeof(local))<0)

//監聽

if(listen(sock, 5)<0)

while(1)

inet_ntop(af_inet, &peer.sin_addr, buf, sizeof(buf));

printf("get a connect,ip:%s,port:%d\n",buf, ntohs(peer.sin_port));

while(1)

else

write(new_sock,buf,strlen(buf)+1);}}

close(sock);

return

0;}

tcpclient.c(客戶端)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char *argv)

//建立套接字

int sock=socket(af_inet,sock_stream, 0);

if(sock < 0)

struct sockaddr_in server;

server.sin_family = af_inet;

server.sin_port = htons(atoi(argv[2]));

server.sin_addr.s_addr = inet_addr(argv[1]);

//建立連線

int ret = connect(sock, (struct sockaddr*)&server, \

sizeof(server));

if(ret < 0)

printf("connect success...\n");

while(1)

write(sock, buf, sizeof(buf));

if(strncmp(buf, "quit",4)==0)

break;

read(sock, buf, sizeof(buf));

printf("server :%s",buf);

}close(sock);

return

0;}

在本地網路中建立連線,執行結果如下:

TCP互動流程,用網路套接字實現TCP互動例項

我們來了解一下tcp互動流程 大致流程如下 1 伺服器根據位址的型別 屬於ipv4還是ipv6等 socket型別 比如tcp udp 去建立socket,建立出的套接字socket本質上是個檔案描述符。2 伺服器繫結ip位址和埠號到套接字socket 3 伺服器socket 監聽 埠號請求,隨時準...

linux網路程式設計 tcp套接字

1.標頭檔案 include include include include include 2.接受傳送流程 服務端 include include include include include include int main printf hello,welcome to my server...

UNIX網路程式設計 TCP套接字選項

一直想寫一下tcp通訊的事,套接字選項 so debug 當給乙個tcp套接字開啟本選項時,核心將為tcp在該套接字傳送和接收的所有分組保留詳細跟蹤資訊。so dontroute 本選項規定外出的分組將繞過底層協議的正常路由機制。so keepalive 本選項的功用是檢測對端主機是否崩潰或變得不可...