Linux之 網路通訊(程序和執行緒實現併發通訊)

2021-07-24 11:18:05 字數 3117 閱讀 6664

程序:

tcpserver_fork.c

#include #include #include #include #include #include #include #include #define my_port 3333

int main(int argc ,char **argv)

bzero(&client_addr,sizeof(struct sockaddr_in));

client_addr.sin_family=af_inet;

client_addr.sin_port=htons(my_port);

client_addr.sin_addr.s_addr=htonl(inaddr_any);

n=1;

/* 如果伺服器終止後,伺服器可以第二次快速啟動而不用等待一段時間 */

setsockopt(listen_fd,sol_socket,so_reuseaddr,&n,sizeof(int));

if(bind(listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0)

listen(listen_fd,5);

while(1)

if((n=fork())==0)

buffer[nbytes]='\0';

printf("server received %s\n",buffer);

close(listen_fd);

close(accept_fd);

exit(0);

}else

close(accept_fd);

}}

執行緒:tcpserver_pthread.c

#include #include #include #include #include #include #include #include #define portnumber 3333

void * read_msg(void *arg)

}void * write_msg(void * arg)

}int main(int argc, char *argv)

/* 伺服器端填充 sockaddr結構 */

bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0

server_addr.sin_family=af_inet; // internet

server_addr.sin_addr.s_addr=htonl(inaddr_any); // (將本機器上的long資料轉化為網路上的long資料)和任何主機通訊 //inaddr_any 表示可以接收任意ip位址的資料,即繫結到所有的ip

//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用於繫結到乙個固定ip,inet_addr用於把數字加格式的ip轉化為整形ip

server_addr.sin_port=htons(portnumber); // (將本機器上的short資料轉化為網路上的short資料)埠號

/* **sockfd描述符到ip位址 */

if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

/* 設定允許連線的最大客戶端數 */

if(listen(sockfd,5)==-1)

while(1)

fprintf(stderr,"server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); // 將網路位址轉換成.字串

pthread_create(&id,null,(void *)read_msg,(void *)&new_fd);

pthread_create(&id,null,(void *)write_msg,(void *)&new_fd);

} /* 結束通訊 */

close(sockfd);

exit(0);

}

tcpclient.c(程序和執行緒的客戶端基本一樣)

#include #include #include #include #include #include #include #include #define portnumber 3333

void * read_msg(void *arg)

}int main(int argc, char *argv)

if((host=gethostbyname(argv[1]))==null)

/* 客戶程式開始建立 sockfd描述符 */

if((sockfd=socket(af_inet,sock_stream,0))==-1) // af_inet:internet;sock_stream:tcp

/* 客戶程式填充服務端的資料 */

bzero(&server_addr,sizeof(server_addr)); // 初始化,置0

server_addr.sin_family=af_inet; // ipv4

server_addr.sin_port=htons(portnumber); // (將本機器上的short資料轉化為網路上的short資料)埠號

server_addr.sin_addr=*((struct in_addr *)host->h_addr); // ip位址

/* 客戶程式發起連線請求 */

if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

pthread_t id;

pthread_create(&id,null,(void *)read_msg,(int *)&sockfd);

/* 連線成功了 */

while(1)

/* 結束通訊 */

close(sockfd);

exit(0);

}

網路通訊之校驗

這是乙個可選的選項,並不是所有的系統都對udp資料報加以檢驗和資料 相對tcp協議的必須來說 但是rfc中標準要求,傳送端應該計算檢驗和。udp檢驗和 覆蓋udp協議頭和資料,這和ip的檢驗和是不同的,ip協議的檢驗和只是覆蓋ip資料頭,並不覆蓋所有的資料。tcp校驗 首部和資料的校驗和 udp校驗...

網路通訊之BIO

bio 同步並阻塞 傳統阻塞型 伺服器實現模式為乙個連線乙個執行緒,即客戶端有連線請求時伺服器端就需要啟動乙個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷.bio常用類 datagrampacket datagramsocket封包 datagramsocket ds new d...

網路通訊之TCP UDP

1 udp乙個socket接收緩衝區的預設值 cat proc sys net core rmem default 212992,單位byte,208kb 3 每個udp socket都有乙個接收緩衝區,沒有傳送緩衝區,從概念上來說就是只要有資料就發,不管對方是否可以正確接收,所以不緩衝,不需要傳送...