程式設計模型:
serve:client:
建立套接字(socket)
建立套接字(socket)
準備本機位址(sockaddr_in)
準備目標機位址
繫結(bind)
監聽/宣告願意連線(listen)
等待連線/獲取連線請求並建立連線(accept fork)
連線(connect)
接收請求(read/recv)
傳送請求(write/send)
響應請求(write/send)
接收響應(read/recv)
關閉(close)
關閉(close)
先對使用socket進行tcp通訊的幾個函式做個說明:
#include int listen(int socket,int backlog);
功能: 宣告它願意接收連線請求/設定等待連線的最大數量
sockfd: 被監聽的套接字描述符
backlog: 提示系統該程序所要入隊的未完成連線請求的數量
返回值: 成功返回0,失敗返回,-1
注:一旦伺服器呼叫了listen,套接字就能接收連線請求
#include int accept(int socket,struct sockaddr *addr,socklen_t *addrlen);
功能:獲取連線請求並建立連線
addr:獲取連線的位址
addrlen:設定連線位址結構體的長度
int bind(int sockfd,const strucr sockaddr *addr,socklen_t addrlen);
sockfd:sockfd描述符:socket函式的返回值
addr:通訊位址結構體,實際給的是sockaddr_un 或 sockaddr_in 需要強制型別轉換。
addrlen:通訊位址結構體型別的位元組數,使用sizeof計算。
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
功能:在請求服務的程序套接字(客戶端)和提供服務的程序套接字(伺服器)之間建立連線
sockfd:套接字描述符
addr:通訊目標位址
返回值:在不同的程式設計模型下返回值意義不同,在本地通訊返回加0,失敗返回-1。
附上具體的實現**
/**伺服器端**(linux下)**/
#include #include #include #include #include #include int main()
puts("準備位址");
struct sockaddr_in addr = {};
addr.sin_family = af_inet;
addr.sin_port = htons(6677);
addr.sin_addr.s_addr = inet_addr("10.0.2.15");
socklen_t len = sizeof(addr);
puts("繫結位址");
if(bind(sockfd,(struct sockaddr*)&addr,len))
puts("設定監聽");
if(listen(sockfd,5))
puts("等待連線");
for(;;)
; socklen_t lencli = sizeof(addrcli);
int clifd = accept(sockfd,(struct sockaddr*)&addrcli,&lencli);
if(0 > clifd)
if(0 == fork())
; for(;;)
}} }
}
/**客戶端**(linux下)**/
#include #include #include #include #include #include #include int main()
puts("準備位址");
struct sockaddr_in addr = {};
addr.sin_family = af_inet;
addr.sin_port = htons(6677);
addr.sin_addr.s_addr = inet_addr("10.0.2.15");
socklen_t len = sizeof(addr);
puts("連線伺服器");
if(connect(sockfd,(struct sockaddr*)&addr,len))
char buf[1024] = {};
for(;;)
printf("read:");
read(sockfd,buf,sizeof(buf));
printf("%s\n",buf);
} close(sockfd);
}
基於TCP協議的C S通訊
一 環境 os win10 ide visual studio 2010 二 在同一解決方案下新建兩個win32控制台應用程式,專案名分別是server和client,分別在兩個專案的原始檔下新增server.cpp和client.cpp server.cpp include include inc...
基於UDP和TCP實現CS
1.我們應該先了解udp和tcp協議 首先udp和tcp是基於傳輸層的協議 我們需要了解udp和tcp的特性 tcp協議的特性 1 面向連線的服務 2 可靠的資料傳輸服務 3 面向位元組流。udp協議的特性 1 無連線服務 2 不可靠的資料傳輸 3 面向資料報 以下是流行網際網路應用層及其應用層協議...
用C 實現基於用C 實現基於TCP協議的網路通訊
tcp 協議是乙個基本的網路 協議,基本上所有的網路服務都是基於 tcp協議的,如http,ftp等等,所以要了解網路程式設計就必須了解基於 tcp協議的程式設計。然而 tcp協議是乙個龐雜的體系,要徹底的弄清楚它的實現不是一天兩天的功夫,所幸的是在.net framework環境下,我們不必要去追...