建立TCP連線,實現基本通訊

2021-07-04 19:05:22 字數 2162 閱讀 6297

建立監聽套接字(socket函式),繫結監聽介面(bind函式),進行監聽(listen),呼叫connect函式等待在監聽套接字上等待連線套接字的描述符:

1. 建立監聽套接字,並繫結監聽介面:

int sockfd = socket(af_inet,sock_stream,0);  // af_inet說明為 ipv4協議,sock_stream說明為套接字流

sockaddr_in servaddr; //ipv4支援的位址格式為 sockaddr_in,網路傳輸支援的位址格式為 sockaddr

//初始化監聽套接字要繫結的位址,其中輸入位址繫結為 inaddr_any

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(port); //監聽埠號為 port

servaddr.sin_addr.s_addr = htonl(inaddr_any);

bind(sockfd,(sockaddr*)&servaddr,sizeof(servaddr));

2.進行監聽並返回連線的套接字

int connfd;

listen(sockfd,listenq); //listenq為允許的最大的監聽排隊套接字,自定義

for(;;)

定義 tcp_serv()函式,返回乙個已建立好並保持監聽的套接字

int tcp_serv()

建立套接字,設定伺服器端的位址,呼叫connect將套接字連線到伺服器

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

int n;

sockaddr_in servaddr;

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(port); //與伺服器端繫結的埠號相同的埠號

inet_pton(af_inet,addr,&servaddr.sin_addr); //addr為伺服器的ip位址,需要自定義

//重複建立連線,最多嘗試10次,直到連線成功建立

//*****需要特別注意,當connect失敗想要重連時,需要使用新的socket套接字描述符

for(; n != 10; ++n)

if(n == 10)

cout

<< 「connect error」 << endl;

//連線成功建立,使用套接字描述符 sockfd 與伺服器端進行通訊

定義 tcp_cli()函式,返回乙個已建立好並保持監聽的套接字

int tcp_cli()

if(n == 10)

cout

<< 「connect error」 << endl;

return sockfd;

}

//從套接字描述符sockfd中讀取一行,並放入string引數中

int read(int sockfd,string & str)

//將 string 引數中的字元全寫到套接字 sockfd 中

size_t write(int sockfd,const

string & str)

len -= n;

ptr += n;

}return n;

}

伺服器端:

int main(int argc,char ** argv)

else

if(pid == 0)

close(connfd);

}}

客戶端:

int main()

}

TCP建立連線

3 月,跳不動了?對tcp 面向連線 特性的學習研究。什麼是面向連線?tcp為什麼要進行面向連線的通訊?tcp 連線建立的過程是怎樣的?建立連線的通訊過程 打 是面向連線的通訊 a 呼叫 b b 接受並且此時 a 還沒有結束通話,連線建立成功,a b 雙方正常通訊。如果 b 不接受呼叫,連線無法建立...

TCP建立與斷開連線 SOCKET通訊模板

傳輸層中,tcp建立傳輸鏈結時的三次握手和關閉鏈結的四次揮手,因為socket工作於應用層和傳輸層之間,所以涉及建立鏈結和關閉鏈結的過程 tcp使用視窗機制進行流量控制,什麼是視窗?連線建立時,各端分配一塊緩衝區用來儲存接收的資料,並將緩衝區的尺寸傳送給另一端 接收方傳送的確認資訊中包含了自己剩餘的...

TCP協議 建立連線

上面第四步的ack報文不占用序列號 為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤 謝希仁版 計算機網路 中的例子是這樣的,已失效的連線請求報文段 的產生在這樣一種情況下 client發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某...