建立監聽套接字(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發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某...