基於tcp---通訊模型
由上圖可以得出tcp通訊的步驟如下:
服務端:
1、建立乙個socket,用函式socket();
2、繫結ip位址、埠等資訊到socket上,用函式bind();
3、設定允許的最大連線數,用函式listen();
4、等待來著客戶端的連線請求,用函式accept();
5、收發資料,用函式send()和recv(),或者read()和write();
6、關閉網路連線;
客戶端:
1、建立乙個socket,用函式socket;
2、設定要連線的伺服器的ip位址和埠等屬性;
3、連線伺服器,用函式connect();
4、收發資料,用函式send()和recv(),或者read()和write();
5、關閉網路連線;
示例程式如下:
服務端:
客戶端:#include #include #include #include #include #include #include #define prot_number 3333
#define link_number 20
#define buf_size 1024
int main(int argc, char *argv);
bzero(&server_addr, sizeof(struct sockaddr_in));
bzero(&client_addr, sizeof(struct sockaddr_in));
//建立socket套結字
server_fd = socket(af_inet,sock_stream,0);/*af_inet:ipv4;socket_stream: tcp*/
if(server_fd == -1)
//填充socket套結字
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(prot_number);
server_addr.sin_addr.s_addr = htonl(inaddr_any);
//繫結套結字
if((bind(server_fd, (struct sockaddr *)(&server_addr),sizeof(struct sockaddr_in))) == -1)
//設定最大連線數
if((listen(server_fd, link_number)) == -1)
sin_size = sizeof(struct sockaddr_in);
//伺服器阻塞,等待客戶端鏈結
if((new_sockfd = accept(server_fd,(struct sockaddr *)(&client_addr),&sin_size)) == -1)
fprintf(stdout,"server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
while(1)
else if(*buf == '\0')
printf("server received %s\n",buf);
bzero(&buf,buf_size);
} close(server_fd);
return 0;
}
總結:1、填充sockaddr結構體時,注意位元組序;2、服務端的阻塞位置 accept (等待客戶端) recv (接收時的阻塞);#include #include #include #include #include #include #include #include #define server_port 3333
#define buf_size 1024
int main(int argc, char *argv)
int client_fd;
struct sockaddr_in server_addr;
struct hostent *host;
char buf[buf_size] = ;
bzero(&server_addr,sizeof(struct sockaddr_in));
//通過網域名稱得到ip
if((host = gethostbyname(argv[1])) == null)
exit(exit_failure);
} //建立套結字
client_fd = socket(af_inet, sock_stream , 0);
if(client_fd == -1)
//填充服務端sockaddr結構
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(server_port);
server_addr.sin_addr = *((struct in_addr*)host->h_addr);
//連線伺服器
if((connect(client_fd, (struct sockaddr *)(&server_addr),sizeof(struct sockaddr_in))) == -1)
while(1)
//傳送資料
if((send(client_fd,buf,sizeof(buf),0)) == -1)
} close(client_fd);
}
網路程式設計 TCP
客戶端 1.建立客戶端的socket服務,指定目的主機和埠 2.為了傳送資料,應該獲取socket中的輸出流 3.獲取socket中的輸入流來獲取服務端的反饋資料 4.關閉資源 服務端 1.建立服務端的serversocket服務,並監聽乙個埠 2.通過accept方法 等待並獲取連線過來的客戶端s...
網路程式設計 TCP
即有傳送緩衝區 接收緩衝區,傳送次數和接收次數不一定對等。報頭長,成本高,需要搭載更多的資料。1.三次握手 通過對ack的確認,建立可靠連線。有超時重傳機制 2.四次揮手 有可能伺服器處理資料的時間較短,即三次揮手 3.狀態圖 2 保證遲來的資料報能被識別並丟棄 4.tcp狀態轉移過程 5.tcp報...
網路程式設計 TCP
網路程式設計的傳輸層協議一般分為udp和tcp 其中tcp協議是面向連線的,可靠的,流式服務的協議。簡而言之就是安全性完整性更高的,但效率低於udp的協議。本文將重點涉及linux下具體的採取tcp協議的網路程式設計 實現。首先最基本的要有兩份 即伺服器端和客戶端各乙份。伺服器端程式設計流程如下 1...