資源簡介
Linux 網絡編程——并發服務器的三種實現模型,相關教程如下:
http://blog.csdn.net/tennysonsky/article/details/45671215

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
/************************************************************************
函數名稱: void?main(int?argc?char?*argv[])
函數功能: 主函數,用進程建立一個TCP?Echo?Server
函數參數: 無
函數返回: 無
************************************************************************/
int?main(int?argc?char?*argv[])
{
unsigned?short?port?=?8080; //?本地端口
//?創建tcp套接字
int?sockfd?=?socket(AF_INET?SOCK_STREAM?0);???
if(sockfd?0)
{
perror(“socket“);
exit(-1);
}
//?配置本地網絡信息
struct?sockaddr_in?my_addr;
bzero(&my_addr?sizeof(my_addr)); ??//?清空???
my_addr.sin_family?=?AF_INET; ??//?IPv4
my_addr.sin_port???=?htons(port); ??//?端口
my_addr.sin_addr.s_addr?=?htonl(INADDR_ANY);?//?ip
//?綁定
int?err_log?=?bind(sockfd?(struct?sockaddr*)&my_addr?sizeof(my_addr));
if(?err_log?!=?0)
{
perror(“binding“);
close(sockfd);
exit(-1);
}
//?監聽,套接字變被動
err_log?=?listen(sockfd?10);?
if(err_log?!=?0)
{
perror(“listen“);
close(sockfd);
exit(-1);
}
while(1)?//主進程?循環等待客戶端的連接
{
char?cli_ip[INET_ADDRSTRLEN]?=?{0};
struct?sockaddr_in?client_addr;
socklen_t?cliaddr_len?=?sizeof(client_addr);
//?取出客戶端已完成的連接
int?connfd?=?accept(sockfd?(struct?sockaddr*)&client_addr?&cliaddr_len);
if(connfd?0)
{
perror(“accept“);
close(sockfd);
exit(-1);
}
pid_t?pid?=?fork();
if(pid?0){
perror(“fork“);
_exit(-1);
}else?if(0?==?pid){?//子進程?接收客戶端的信息,并發還給客戶端
/*關閉不需要的套接字可節省系統資源,
??同時可避免父子進程共享這些套接字
??可能帶來的不可預計的后果
*/
close(sockfd);???//?關閉監聽套接字,這個套接字是從父進程繼承過來
char?recv_buf[1024]?=?{0};
int?recv_len?=?0;
//?打印客戶端的?ip?和端口
memset(cli_ip?0?sizeof(cli_ip));?//?清空
inet_ntop(AF_INET?&client_addr.sin_addr?cli_ip?INET_ADDRSTRLEN);
printf(“----------------------------------------------\n“);
printf(“client?ip=%sport=%d\n“?cli_ipntohs(client_addr.sin_port));
//?接收數據
while(?(recv_len?=?recv(connfd?recv_buf?sizeof(recv_buf)?0))?>?0?)
{
printf(“recv_buf:?%s\n“?recv_buf);?//?打印數據
send(connfd?recv_buf?recv_len?0);?//?給客戶端回數據
}
printf(“client?closed!\n“);
close(connfd);????//關閉已連接套接字
exit(0);
}else?if(pid?>?0){ //?父進程
close(connfd);????//關閉已連接套接字
}
}
close(sockfd);
????return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????2710??2015-05-13?14:56??并發服務器測試代碼\tcp_echo_fork.c
?????文件????????3213??2015-05-13?15:44??并發服務器測試代碼\tcp_echo_pthread.c
?????文件????????3485??2015-05-13?17:10??并發服務器測試代碼\tcp_echo_pthread_pro.c
?????文件????????4311??2015-05-15?14:39??并發服務器測試代碼\tcp_echo_select.c
?????文件????????1976??2015-05-13?12:13??并發服務器測試代碼\tcp_while_recv.c
?????文件????????1739??2015-05-13?12:00??并發服務器測試代碼\udp_while_recv.c
?????目錄???????????0??2015-05-15?14:47??并發服務器測試代碼\
- 上一篇:SyntaxHighlighter 3.0.83
- 下一篇:事件觸發的多智能體一致性
評論
共有 條評論