免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3618 | 回复: 19
打印 上一主题 下一主题

[网络] socket select 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-02 15:32 |只看该作者 |倒序浏览
本帖最后由 liuchang8877 于 2012-08-02 15:47 编辑

弱弱地问下, clien t /server   同时都用select , client 向 server 发数据,   为什么  server 端的 select 的返回值是0?? 必须先从server 端 send  才能建立链接?
希望大牛们指教。

  1. //server.c
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5. #include<sys/socket.h>
  6. #include<arpa/inet.h>
  7. #include<sys/types.h>
  8. #include<errno.h>
  9. #include<netdb.h>
  10. #include<string.h>
  11. #include<signal.h>
  12. #include<stdarg.h>  /*va_list*/


  13. #define DIRECT_GET_CFG_PORT "21000"
  14. #define PROTOCOL            "tcp"
  15. #define LINK_CHECK_TIMES    5

  16. FILE *SafeLibErrorDest = NULL;
  17. const char *SafeLibErrorLoc;
  18. int SafeLibErrno = 0;

  19. int server_init(const char *port,const char *proto);
  20. void socketaddr_init(struct sockaddr_in *socketaddr);
  21. int socketaddr_service(struct sockaddr_in *socketaddr,const char *service, const char *proto);
  22. static int checkstring(const char *string);
  23. void HandleError(int ecode, const char *const caller,
  24.                                  const char *fmt, ...);

  25. int prototype(const char *proto);
  26. int resolveproto(const char *proto);



  27. int server_init(const char *port,const char *proto)
  28. {
  29.         /*debug*/
  30.         printf("server_init,port:%s---proto:%s\n",port,proto);
  31.         struct sockaddr_in socketaddr;
  32.         int mastersock;
  33.         int trueval  = 1;
  34.        
  35.         socketaddr_init(&socketaddr);
  36.         socketaddr.sin_addr.s_addr = INADDR_ANY;
  37.         socketaddr_service(&socketaddr,port,proto);
  38.        
  39.         mastersock = socket(PF_INET,prototype(proto),resolveproto(proto));
  40.        
  41.         if(mastersock < 0){
  42.                 HandleError(errno,"serverinit","counldn't create socket");
  43.                 return -1;
  44.         }
  45.         setsockopt(mastersock,SOL_SOCKET,SO_REUSEADDR,&trueval,sizeof(socklen_t));
  46.         if(bind(mastersock,(struct sockaddr*)&socketaddr,sizeof(socketaddr)) < 0){
  47.                 HandleError(errno,"serverinit","couldn't create socket");
  48.                 return -1;
  49.         }
  50.        
  51.         if(prototype(proto) == SOCK_STREAM){
  52.                 if(listen(mastersock,5) < 0){
  53.                         HandleError(errno,"serverinit","listen on port %d failed",port);
  54.                         return -1;
  55.                 }
  56.         }
  57.         else if(prototype(proto) == SOCK_DGRAM){
  58.                 int buf_size = 512 *1024;
  59.                 setsockopt(mastersock,SOL_SOCKET,SO_RCVBUF,(char *)&buf_size,sizeof(int));
  60.         }
  61.        
  62.         return mastersock;
  63. }

  64. void socketaddr_init(struct sockaddr_in *socketaddr)
  65. {
  66.     memset(socketaddr,0,sizeof(struct sockaddr));
  67.         socketaddr->sin_family = AF_INET;
  68. }

  69. int socketaddr_service(struct sockaddr_in *socketaddr,const char *service, const char *proto)
  70. {
  71.         struct servent *serviceaddr;

  72.         /*debug*/
  73.         printf("socketaddr_service,service:%s---proto:%s\n",service,proto);
  74.         if(strcmp(service,"0") ==0)
  75.                 socketaddr->sin_port = 0;
  76.         else{
  77.                 serviceaddr = getservbyname(service,proto);
  78.                 if(serviceaddr){
  79.                         socketaddr->sin_port = serviceaddr->s_port;
  80.                 }else{
  81.                         if(checkstring(service)){
  82.                                 HandleError(0,"socket_service","no lookup for %s/%s",service,proto);
  83.                                 return -1;
  84.                         }
  85.                         if(0 == (socketaddr->sin_port = htons((u_short)atoi(service)))){
  86.                                 HandleError(0,"socketaddr_service","numeric conversion failed");
  87.                                 return -1;
  88.                         }
  89.                 }
  90.         }
  91.         /*debug*/
  92.         printf("socketaddr_service:port:%d\n",socketaddr->sin_port);

  93.         return 0;
  94. }

  95. static int checkstring(const char *string)
  96. {
  97.         unsigned int counter;
  98.         for(counter = 0; counter <strlen(string); counter++)
  99.                 if(!isdigit(string[counter]))
  100.                         return 1;
  101.         return 0;
  102. }

  103. void HandleError(int ecode, const char *const caller,
  104.                                  const char *fmt, ...) {

  105.         va_list  fmtargs;
  106.         struct sigaction sastruct;
  107.         FILE *of = (SafeLibErrorDest) ? SafeLibErrorDest : stderr;

  108.         /* Safe these into global variables for any possible signal handler. */

  109.         SafeLibErrorLoc = caller;
  110.         SafeLibErrno = ecode;

  111.         /* Print the error message(s) */

  112.         va_start(fmtargs, fmt);

  113.         fprintf(of, "*** Error in %s: ", caller);
  114.         vfprintf(of, fmt, fmtargs);
  115.         va_end(fmtargs);
  116.         fprintf(of, "\n");
  117.         if (ecode) {
  118.                 fprintf(of, "*** Error cause: %s\n", strerror(ecode));
  119.         }

  120.         /* Exit if no signal handler.        Otherwise, raise a signal. */

  121.         sigaction(SIGUSR1, NULL, &sastruct);
  122.         if (sastruct.sa_handler != SIG_DFL)
  123.         {
  124.                 raise(SIGUSR1);
  125.         }
  126. //         else
  127. //         {
  128. //                 exit(254);
  129. //         }
  130. }

  131. int prototype(const char *proto)
  132. {
  133.         if(0 == strcmp(proto,"tcp"))
  134.                 return SOCK_STREAM;
  135.         if(0 == strcmp(proto,"udp"))
  136.                 return SOCK_DGRAM;
  137. return -1;
  138. }

  139. int resolveproto(const char *proto)
  140. {
  141.         struct protoent *protocol;
  142.         protocol = getprotobyname(proto);
  143.         if (!protocol)
  144.         {
  145.                 HandleError(0, "resolveproto", "getprotobyname failed for %s", proto);
  146.                 return -1;
  147.         }
  148.         return protocol->p_proto;
  149. }


  150. int main(void)
  151. {
  152.         int                                        mastersock;
  153.         int                                                workersock;
  154.         struct sockaddr_in      socketaddr;
  155.         int                                    addrlen;
  156.         int                                        nfds = 0;
  157.        
  158.         fd_set                            orig_fdset,fdset;
  159.         int                                        selectVal;
  160.         char                                logmsg[256];
  161.        
  162.         struct timeval     timeOut, tvCurr, tvLimit;
  163.         char                    BUF[256];       

  164.         mastersock  = server_init(DIRECT_GET_CFG_PORT,PROTOCOL);
  165.         /*debug*/
  166.         printf("*****mastersock:%d\n",mastersock);

  167.         if(mastersock >= nfds)
  168.                 nfds = mastersock + 1;
  169.        
  170.         timeOut.tv_sec =LINK_CHECK_TIMES;
  171.         timeOut.tv_usec = 0;
  172.         FD_ZERO(&orig_fdset);
  173.         FD_SET(mastersock,&orig_fdset);
  174.        
  175.         addrlen = sizeof(socketaddr);
  176.         /*debbug*/
  177.         printf("addrlen:%d\n",addrlen);

  178.         gettimeofday(&tvCurr,0);
  179.         tvLimit = tvCurr;
  180.         tvLimit.tv_sec += LINK_CHECK_TIMES;
  181.        
  182.         while(1){
  183.                 bcopy(&orig_fdset,&fdset,sizeof(orig_fdset));
  184.                 timeOut.tv_sec = tvLimit.tv_sec - tvCurr.tv_sec;
  185.                 timeOut.tv_usec = 0;       
  186.                
  187.                 selectVal = select(nfds,&fdset,(fd_set *)0,(fd_set *)0,0);
  188.                 /*debug*/
  189.                 printf("selectVal:%d\n",selectVal);
  190.                 if(selectVal > 0){
  191.                         if(FD_ISSET(mastersock,&fdset)){
  192.                                 /*debug*/
  193.                                 printf("Under FD_ISSET\n");

  194.                                 workersock = accept(mastersock,(struct sockaddr *)&socketaddr,(socklen_t *)&addrlen);
  195.                                 //sprintf("Received connection from a client %s port %d,sock id %d",inet_ntoa(socketaddr.sin_addr),ntohs(socketaddr.sin_port),workersock);
  196.                                 /*debug*/
  197.                                 printf("worlersock:%d\n",workersock);

  198.                                 if(workersock >= 0){
  199.                                         printf("start to send card info !\r \n");
  200.                                         memset(BUF,'2',256);
  201.                                         //write(workersock,BUF,256);
  202.                                         /*debug*/
  203.                                         //printf("sockId:%d\n",workersock);
  204.                                         send(workersock,BUF,256,0);
  205.                                     //sleep(1);       
  206.                                         int result = recv(workersock,BUF,256,0);
  207.                                     //(workersock,BUF,256);
  208.                                         printf("result:%d:,recv data:%s\n",result,BUF);
  209.                                         //close(workersock);
  210.                                 }
  211.                         }

  212.                 }else if(0 == selectVal){
  213.                         printf("warning: select retun 0");
  214.                         sleep(1);
  215.                 }else{

  216.                         printf("error:select return error");
  217.                         sleep(1);
  218.                 }

  219.         }
  220.        
  221.         close(mastersock);
  222.         return 0;
  223. }
复制代码

  1. //client.c  
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5. #include<string.h>
  6. #include<sys/socket.h>
  7. #include<sys/types.h>
  8. #include<netinet/in.h>     /*struct in_addr*/
  9. #include<errno.h>
  10. #include<time.h>
  11. #include<sys/time.h>
  12. #include<stdarg.h>         /*va_list*/
  13. #include<signal.h>         /*sigaction*/
  14. #include<arpa/inet.h>
  15. #include<ctype.h>
  16. #include<sys/ioctl.h>
  17. #include<netdb.h>


  18. #define SERVER_IP    "192.168.141.135"
  19. #define SERVER_PORT  "21000"

  20. #ifndef __cplusplus
  21. typedef char bool;
  22. #define true  1
  23. #define TRUE  1
  24. #define false 0
  25. #define FALSE 0
  26. #endif

  27. typedef signed long long    SInt64;

  28. #define BUFSIZE 256
  29. #define SEC 3
  30. #define TIMEOUT 5
  31. #define PROTO  "tcp"

  32. const char *SafeLibErrorLoc;
  33. int SafeLibErrno = 0;
  34. FILE *SafeLibErrorDest = NULL;

  35. int     safeclose(int fd);
  36. void        HandleError(int ecode, const char *const caller,const char *fmt,...);
  37. int     clientconnect(const char *host,const char *port, const char *proto);
  38. int     resolveproto(const char *proto);
  39. SInt64  Milliseconds();
  40. int     prototype(const char *proto);
  41. void    socketaddr_init(struct sockaddr_in *socketaddr);
  42. int     socketaddr_service(struct sockaddr_in *socketaddr, const char *service, const char *proto);
  43. int     socketaddr_host(struct sockaddr_in *socketaddr, const char *host);
  44. int     server_init(const char *port, const char *proto);
  45. static int checkstring(const char *string);

  46. //主要部分
  47. int main(void)
  48. {       
  49.         int sockId = -1;
  50.         int count  = 0;
  51.     int status = 0;
  52.         int timeOutCount;
  53.         fd_set selectSet, oriSelectSet;
  54.         SInt64   sStart = 0;
  55.         SInt64   snow = 0;
  56.         SInt64 sRecvLen=0,sLastRecvLen=0;
  57.         struct timeval  timeOut;
  58.         int selectRvalue;
  59.         int result;
  60.         char cefBuff[BUFSIZE];
  61.         float fSafeNumber=0.0;


  62.         while(1){
  63.                 struct in_addr                addr;
  64.                 char*                                serverIpStr;
  65.                 char*                                tmpPort;
  66.                 bool                                bMultiCast = false;
  67.                 bool                isUDP = false;
  68.                 char                                IPFirst[4] = {0};
  69.                 long                                nIpFirst;
  70.                 int                                        initFlag = 1;
  71.                 status = 0;
  72.                 timeOutCount  = 0;
  73.                 char  Proto[4] = PROTO;
  74.                
  75.                 if(sockId >= 0){
  76.                         safeclose(sockId);
  77.                         sockId  = -1;
  78.                         sleep(1);
  79.                 }
  80.        
  81.                 //char *ip = SERVER_IP;
  82.                 //初始化
  83.                 //addr.s_addr = (in_addr_t)ip;
  84.                 //strcpy(serverIpStr,inet_ntoa(addr));
  85.                 //sprintf(tmpPort,"%d",(int)SERVER_PORT);
  86.                 serverIpStr = SERVER_IP;
  87.                 tmpPort = SERVER_PORT;
  88.                 /*debug*/
  89.                 printf("serverIpStr:%s\n",serverIpStr);
  90.        
  91.                 for(count = 0; count < 3; count++){
  92.                         sockId = clientconnect(serverIpStr,tmpPort,Proto);
  93.                        
  94.                         printf("sockId:%d\n",sockId);
  95.                         if(sockId >= 0) break;
  96.                         sleep(1);
  97.                 }
  98.                 /*debug*/
  99.                 printf("out for count <3\n");

  100.                 if(sockId < 0){
  101.                         sprintf("fail, connect lve ip is %s,port id %s,try times is %d\n NOW GO TO TRY_OTHER:",serverIpStr,tmpPort,count);
  102.                         continue;
  103.                 }
  104.                 if(bMultiCast){
  105.                         struct ip_mreq x;
  106.                         unsigned long ipaddr_t  = addr.s_addr;
  107.                         memcpy(&x.imr_multiaddr.s_addr,&ipaddr_t,sizeof(ipaddr_t));
  108.                         if(setsockopt(sockId,SOL_IP,IP_ADD_MEMBERSHIP,(char *)&x,sizeof(struct ip_mreq)) == -1){
  109.                                 printf("setsockopt error: %s\n",strerror(errno));
  110.                         }
  111.                 }
  112.                
  113.                 printf("success,connect lve ip:%s,port %s,sockId %d\n",serverIpStr,tmpPort,sockId);

  114.                 FD_ZERO(&oriSelectSet);
  115.                 FD_SET(sockId,&oriSelectSet);

  116.                 sStart = Milliseconds();
  117.                 while(initFlag){
  118.                         memcpy(&selectSet,&oriSelectSet,sizeof(selectSet));
  119.                         /*debug*/
  120.                         printf("while(initFlag)\n");       
  121.                         timeOut.tv_sec =3 ;
  122.                         timeOut.tv_usec = 0;
  123.                        
  124.                         selectRvalue = select(sockId+1,&selectSet,NULL,NULL,&timeOut);
  125.                         selectRvalue = 1;
  126.                         if(selectRvalue > 0){
  127.                                 timeOutCount = 0;
  128.                                 printf("in it\n");
  129.                                 if(FD_ISSET(sockId,&selectSet)){
  130.                                          //关键处
  131.                                         int result = recv(sockId,cefBuff,BUFSIZE,0);
  132.                                         if(result){       
  133.                                                 printf("recv data:%s\n",cefBuff);
  134.                                                 sleep(1);
  135.                                                 memset(cefBuff,'1',BUFSIZE);
  136.                                                 printf("send:%s\n",cefBuff);
  137.                                                 int i;
  138.                                                 while(1){
  139.                                                         for(i = 0; i < 100; i++)
  140.                                                         send(sockId,cefBuff,BUFSIZE,0);
  141.                                                 }
  142.                                         }
  143.                                 }//监管
  144.                                
  145.                                 snow = Milliseconds();
  146.                                 if((snow-sStart) >= SEC*1000){
  147.                                         long ltotal  = sRecvLen - sLastRecvLen;

  148.                                         ltotal *= 8;
  149.                                         if(ltotal <(long)fSafeNumber){
  150.                                                 initFlag = 0;
  151.                                                 sRecvLen = sLastRecvLen =0;
  152.                                                 break;
  153.                                         }
  154.                                 sStart = snow;
  155.                                 sLastRecvLen = sRecvLen;
  156.                                 }

  157.                         }else if(selectRvalue == 0){
  158.                         //超时计数
  159.                                 sleep(2);
  160.                                 if(++timeOutCount >= TIMEOUT){
  161.                                         printf("time out\n");
  162.                                         initFlag = 0;
  163.                                 }
  164.                                 continue;
  165.                         }else{
  166.                         //系统出错
  167.                                 if(errno != EINTR)
  168.                                 printf("error sockId :%d",sockId);
  169.                        
  170.                         initFlag  = 0;
  171.                         sleep(2);
  172.                         continue;
  173.                         }
  174.                 }
  175.    }
  176.         printf("exit\n");
  177.         safeclose(sockId);

  178. }


  179. /*安全退出,关闭 sock*/
  180. int safeclose(int fd)
  181. {
  182.         int retval;
  183.        
  184.         retval = close(fd);
  185.         if(fd == -1)
  186.                 HandleError(errno,"close","Possible serious problem: close failed");
  187.         return retval;
  188. }


  189. /*错误处理*/
  190. void HandleError(int ecode, const char *const caller,const char *fmt,...)
  191. {
  192.         va_list fmtargs;
  193.         struct sigaction  sastruct;
  194.         FILE *of = (SafeLibErrorDest)? SafeLibErrorDest: stderr;
  195.    

  196.         SafeLibErrorLoc = caller;
  197.         SafeLibErrno = ecode;
  198.        
  199.         va_start(fmtargs,fmt);

  200.         fprintf(of,"***Error in %s:",caller);
  201.         vfprintf(of,fmt,fmtargs);
  202.         va_end(fmtargs);
  203.         fprintf(of,"\n");
  204.        
  205.         if(ecode){
  206.                 fprintf(of,"*** Error cause: %s\n",strerror(ecode));
  207.         }
  208.         sigaction(SIGUSR1,NULL,&sastruct);
  209.         if(sastruct.sa_handler != SIG_DFL){
  210.                 raise(SIGUSR1);
  211.         }
  212. }

  213. /*进行链接有超时机制*/
  214. int clientconnect(const char *host,const char *port, const char *proto)
  215. {
  216.         int sockid = -1;
  217.         int nProto = resolveproto(proto);
  218.         /*debug*/
  219.         printf("nProto:%d----port:%s,proto:%s\n",nProto,port,proto);
  220.         if(nProto == 17){
  221.                 sockid = server_init(port ,proto);
  222.         }else{
  223.                 unsigned long  non_blocking = 1;
  224.                 unsigned long  blocking = 0;
  225.                 struct sockaddr_in socketaddr;
  226.                 socketaddr_init(&socketaddr);
  227.                 socketaddr_service(&socketaddr,port,proto);
  228.                 socketaddr_host(&socketaddr,host);
  229.                 sockid = socket(PF_INET,prototype(proto),nProto);
  230.                 if(sockid < 0){
  231.                         return -1;
  232.                 }
  233.                 ioctl(sockid,FIONBIO,&non_blocking);
  234.                 if( -1 == connect(sockid,(struct sockaddr *)&socketaddr,sizeof(struct sockaddr))){
  235.                         struct timeval tv;
  236.                         fd_set writefds;
  237.                         int error;
  238.                         //设置链接超时时间
  239.                         tv.tv_sec = 3;  //秒
  240.                         tv.tv_usec = 0;        //毫秒
  241.                         FD_ZERO(&writefds);
  242.                         FD_SET(sockid,&writefds);
  243.                         if(select(sockid+1,NULL,&writefds,NULL,&tv) != 0){

  244.                                 if(FD_ISSET(sockid,&writefds)){
  245.                                         int  len = sizeof(error);
  246.                                         //针对防火墙
  247.                                         if(getsockopt(sockid,SOL_SOCKET,SO_ERROR,(char *)&error,(unsigned int *)&len)  < 0)
  248.                                                 goto error_ret;
  249.                                         if(error != 0)
  250.                                                 goto error_ret;
  251.                                 }else
  252.                                         goto error_ret;   //超时或出错
  253.          
  254.                         }else
  255.                                 goto error_ret;
  256.                         ioctl(sockid,FIONBIO,&blocking);

  257.                 }
  258.                 else{
  259.                
  260. error_ret:
  261.                         safeclose(sockid);
  262.                         return -1;

  263.                 }

  264.         }
  265.         return sockid;
  266. }

  267. /*获得协议*/
  268. int resolveproto(const char *proto)
  269. {
  270.         struct protoent *protocol;
  271.         protocol = getprotobyname(proto);
  272.         /*debug*/
  273.         printf("resolveproto:  proto:%s\n",proto);
  274.         if (!protocol)
  275.         {
  276.                 HandleError(0, "resolveproto", "getprotobyname failed for %s", proto);
  277.                 return -1;
  278.         }
  279.         return protocol->p_proto;
  280. }

  281. /*设置timeval*/
  282. SInt64   Milliseconds()
  283. {
  284.     struct timeval t;
  285.     struct timezone tz;
  286.     gettimeofday(&t, &tz);
  287.        
  288.     SInt64 curTime;
  289.     curTime = t.tv_sec;
  290.     curTime *= 1000;                // sec -> msec
  291.     curTime += t.tv_usec / 1000;    // usec -> msec
  292.     return curTime;
  293. }

  294. /*判断是TCP或是UDP*/
  295. int prototype(const char *proto)
  296. {
  297.         if (strcmp(proto, "tcp") == 0){
  298.                 /*debug*/
  299.                 printf("return SOCK_STREAM\n");
  300.                 return SOCK_STREAM;
  301.         }
  302.         if (strcmp(proto, "udp") == 0){
  303.                 printf("return SOCK_DFRAM\n");
  304.                 return SOCK_DGRAM;
  305.         }
  306.         return -1;
  307. }

  308. /*地址初始化*/
  309. void socketaddr_init(struct sockaddr_in *socketaddr)
  310. {
  311.         bzero((char *) socketaddr, sizeof(*socketaddr));
  312.         socketaddr->sin_family = AF_INET;
  313. }

  314. /*地址初始化*/
  315. int socketaddr_service(struct sockaddr_in *socketaddr, const char *service, const char *proto)
  316. {
  317.         struct servent *serviceaddr;

  318.         /* Need to allow numeric as well as textual data. */

  319.         /* 0: pass right through. */
  320.         if (strcmp(service, "0") == 0)
  321.                 socketaddr->sin_port = 0;
  322.         else
  323.         {/* nonzero port */
  324.                 serviceaddr = getservbyname(service, proto);
  325.                 if (serviceaddr)
  326.                 {
  327.                         socketaddr->sin_port = serviceaddr->s_port;
  328.                 }
  329.                 else
  330.                 { /* name did not resolve, try number */
  331.                         if (checkstring(service))
  332.                         { /* and it's a text name, fail. */
  333.                                 HandleError(0, "socketaddr_service", "no lookup for %s/%s", service, proto);
  334.                                 return -1;
  335.                         }
  336.                         if ((socketaddr->sin_port = htons((u_short)atoi(service))) == 0)
  337.                         {
  338.                                 HandleError(0, "socketaddr_service", "numeric conversion failed");
  339.                                 return -1;
  340.                         }
  341.                 }
  342.         }

  343.         return 0;
  344. }

  345. /*服务器设置地址*/
  346. int socketaddr_host(struct sockaddr_in *socketaddr, const char *host)
  347. {
  348.         struct hostent *hostaddr;
  349.         hostaddr = gethostbyname(host);
  350.         if (!hostaddr)
  351.         {
  352.                 HandleError(0, "socketaddr_host", "gethostbyname failed for %s", host);
  353.                 return -1;
  354.         }

  355.         memcpy(&socketaddr->sin_addr, hostaddr->h_addr, hostaddr->h_length);
  356.         return 0;
  357. }

  358. /*服务端初始化*/
  359. int server_init(const char *port, const char *proto)
  360. {
  361.         struct sockaddr_in  socketaddr;
  362.         int mastersock;
  363.         int trueval = 1;
  364.         /*debug*/
  365.         printf("server_init,port:%s---proto:%s\n",port,proto);
  366.         socketaddr_init(&socketaddr);
  367.         socketaddr.sin_addr.s_addr = INADDR_ANY;
  368.         socketaddr_service(&socketaddr, port, proto);

  369.         mastersock = socket(PF_INET, prototype(proto), resolveproto(proto));
  370.         if (mastersock < 0)
  371.         {
  372.                 HandleError(errno, "serverinit", "couldn't create socket");
  373.                 return -1;
  374.         }
  375.         setsockopt(mastersock,SOL_SOCKET,SO_REUSEADDR,&trueval,sizeof(socklen_t));
  376. //        if (bind(mastersock, (struct sockaddr *)&socketaddr, sizeof(socketaddr)) < 0)
  377.         {
  378.                 HandleError(errno, "serverinit", "bind to port %s failed", port);
  379.                 return -1;
  380.         }

  381.         //setsockopt(mastersock, SOL_SOCKET, 0, &trueval, sizeof(trueval));

  382.         if (prototype(proto) == SOCK_STREAM)
  383.         {
  384.                 if (listen(mastersock, 5) < 0)
  385.                 {
  386.                         HandleError(errno, "serverinit", "listen on port %d failed", socketaddr.sin_port);
  387.                         return -1;
  388.                 }
  389.         }
  390.         else if (prototype(proto) == SOCK_DGRAM) {
  391.                 int buf_size = 512 * 1024;
  392.                 setsockopt(mastersock,SOL_SOCKET,SO_RCVBUF, (char *)&buf_size, sizeof(int));
  393.         }

  394.         return mastersock;
  395. }

  396. static int checkstring(const char *string)
  397. {
  398.         unsigned int counter;
  399.         for (counter = 0; counter < strlen(string); counter++)
  400.                 if (!(isdigit(string[counter])))
  401.                         return 1;
  402.         return 0;
  403. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-08-02 16:20 |只看该作者
为什么就没人回的帖子了?

论坛徽章:
0
3 [报告]
发表于 2012-08-02 16:39 |只看该作者
自己顶上去。希望有人看到

论坛徽章:
0
4 [报告]
发表于 2012-08-02 17:03 |只看该作者
代码太长,问题说的不是很清楚~  能简洁点不?

论坛徽章:
0
5 [报告]
发表于 2012-08-02 17:11 |只看该作者
回复 4# xiyoulaoyuanjia select  什么时候返回 >0 . man 里面说http://linux.die.net/man/2/select 是可用资源数,这个不太明白,能给说说?


   

论坛徽章:
0
6 [报告]
发表于 2012-08-02 20:50 |只看该作者
select返回值 可简单的理解为  阻塞监听的套接字事件集 中做出响应的数目

没看 代码...................太多了 .....
---"client 向 server 发数据,   为什么  server 端的 select 的返回值是0"
服务器端使用select监听该新建连接socket的可读事件没有..

论坛徽章:
0
7 [报告]
发表于 2012-08-02 23:06 |只看该作者
你的select()的timeout设为0,也就是不等待直接返回,没检测到有连接请求的时候,当然返回0了,既然要实现非阻塞的读写,这个值要么是NULL,要么就设一个非0超时。还有你这个select根本没什么意义,你可以把read,write和accept,send,recv都监听,这样才能突出select的用处。

论坛徽章:
0
8 [报告]
发表于 2012-08-03 09:46 |只看该作者
回复 6# Moon_Bird
"服务器端使用select监听该新建连接socket的可读事件没有."
这句不太懂,麻烦能再详细些吗?


   

论坛徽章:
0
9 [报告]
发表于 2012-08-03 09:46 |只看该作者
回复 7# cxchao802
”你可以把read,write和accept,send,recv都监听 “


这个要怎么监听?  

论坛徽章:
2
2015年亚洲杯之日本
日期:2015-03-25 11:21:322015亚冠之柏太阳神
日期:2015-07-13 10:36:04
10 [报告]
发表于 2012-08-03 09:53 |只看该作者
其实也就是用select判断你期待发生的事情发生了没有,如果你期望的是读,那么就等,没有可读的,select就阻塞在那里等待(如果设置超时了,超过设置时间就返回)。如果期待的读事件发生了,select就返回给你回复 8# liuchang8877


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP