程序:
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都有乙個接收緩衝區,沒有傳送緩衝區,從概念上來說就是只要有資料就發,不管對方是否可以正確接收,所以不緩衝,不需要傳送...