TCP網路程式設計

2021-07-03 10:09:31 字數 3156 閱讀 2395

基於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;

}

客戶端:

#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);

}

總結:1、填充sockaddr結構體時,注意位元組序;2、服務端的阻塞位置 accept (等待客戶端) recv (接收時的阻塞);

網路程式設計 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...