zoukankan      html  css  js  c++  java
  • linxu select 返回值

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <netinet/in.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #define BUFFER 800
    #define SERV_PORT 3333
    int main()
    {
    int sockfd,n;
    socklen_t len;
    socklen_t src_len;
    struct sockaddr_in servaddr, cliaddr;
    char msg[BUFFER];
    struct timeval tm;
    fd_set rd_fd, wr_fd, ex_fd;
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
    /* init servaddr */
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);
    /* bind address and port to socket */
    if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
    {
    perror("bind error");
    exit(1);
    }
    src_len = sizeof(cliaddr);
    FD_ZERO(&rd_fd);
    FD_SET(sockfd, &rd_fd);
    tm.tv_sec = 0;
    tm.tv_usec = 0;
    while(1)
    {
    FD_ZERO(&rd_fd);
    FD_SET(sockfd, &rd_fd);
    tm.tv_sec = 1;
    tm.tv_usec = 0;
    if(select(sockfd + 1, &rd_fd, NULL, NULL, &tm) <= 0){
    continue;
    }
    else
    {
    printf("%d, %d/n", tm.tv_sec, tm.tv_usec);
    printf("there is data/n");
    if(recvfrom(sockfd, msg, BUFFER, 0, (struct sockaddr *)&cliaddr, &src_len)< 0)
    {
    perror("receive error!/n");
    exit(0);
    }
    printf("%s/n", msg);
    sleep(5);
    }
    }
    return 0;
    }

    曾经写过如上这样的代码,执行时怎么也得不到预想的结果!
    后来,仔细看man select
    On success, select() and pselect() return the number of file descriptors contained in the three returned descriptor sets(that  is,  the  total  number  of  bits  that are set in readfds, writefds, exceptfds) which may be zero if the timeout expires before anything interesting happens.  On error, -1 is returned, and errno is set appropriately;  the  sets  and timeout become undefined, so do not rely on their contents after an error. 
    原来第一次select的时候出错了,导致rd_fd和tm(主要是rd_fd)的值 become undefined,进而导致以后的select调用的失败!
    解决办法:
    在1处(while循环内的开头),添加如下代码:
    FD_ZERO(&rd_fd);
    FD_SET(sockfd, &rd_fd);
    tm.tv_sec = 1;
    tm.tv_usec = 0;

  • 相关阅读:
    软件测试跟踪工具Bugzilla的安装
    Linux必备命令
    BPM Activiti5 学习资料
    23种Java设计模式-传智播客课程
    linux svn 启动 关闭
    JQuery调用iframe子页面函数/对象的方法
    判断 iframe 是否加载完成的完美方法
    java获得数据库信息常用API(DatabaseMetaData)示例
    JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案
    旧金山大学的算法可视化学习教程 赞的教程,将抽象的算法可视化,易于理解
  • 原文地址:https://www.cnblogs.com/lidabo/p/3803956.html
Copyright © 2011-2022 走看看