标签:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <fcntl.h> #include <netdb.h> #define DEF_STD_ERROR (-1) #define DEF_BIND_PORT (12455) #ifndef TRUE #define TRUE 1 #define FALSE 0 #define BOOL int #endif //set socket(TRUE:block, FALSE:no block) void set_block(int sock,BOOL flag) { int ret; if(flag == TRUE) { ret = fcntl(sock,F_GETFL); ret ^= O_NONBLOCK; fcntl(sock,F_SETFL,ret); } else { ret = fcntl(sock,F_GETFL); ret |= O_NONBLOCK; fcntl(sock,F_SETFL,ret); } } int main(int argc,char *argv[]) { int ret; int sock; struct sockaddr_in addr; pid_t child; char buf[1024]; int len; //create socket sock = socket(AF_INET,SOCK_STREAM,0); if(sock == DEF_STD_ERROR) { printf("%s",strerror(errno)); return -1; } //init address addr.sin_family = AF_INET; addr.sin_port = htons(DEF_BIND_PORT); addr.sin_addr.s_addr = inet_addr("192.168.1.127"); ret = bind(sock,(struct sockaddr*)&addr,sizeof(addr)); if(ret == DEF_STD_ERROR) { printf("%s",strerror(errno)); close(sock); return -1; } //listen ret = listen(sock,5); if(ret == DEF_STD_ERROR) { printf("%s",strerror(errno)); close(sock); return -1; } //set no block set_block(sock,FALSE); //accept while(1) { ret = accept(sock,NULL,NULL); if(ret == DEF_STD_ERROR) { if(errno == EAGAIN) { //printf("yi bu...\n"); usleep(10); continue; } else { printf("%s",strerror(errno)); break; } } //create child process child =fork(); if(child < 0) { send(ret,"now busy,please wait for a moment!",sizeof("now busy,please wait for a moment!"),0); close(ret); printf("%s",strerror(errno)); continue; } else if(child == 0) { child = fork(); if(child == 0) { close(sock); set_block(ret,FALSE); while(1) { len = recv(ret,buf,sizeof(buf),0); if(len == DEF_STD_ERROR) { if(errno == EAGAIN) { usleep(10); continue; } else { printf("%s",strerror(errno)); break; } } else if (len == 0) { printf("Peer common quit!\n"); break; } printf("sock[%d]:%s\n",ret,buf); send(ret,buf,strlen(buf)+1,0); } close(ret); exit(0); } else { close(ret); close(sock); exit(0); } } else { waitpid(child,0,0); close(ret); } } //close close(sock); return 0; }
标签:
原文地址:http://blog.csdn.net/ingnight/article/details/51336119