当前位置: 首页 > 知识库问答 >
问题:

在不同程序中运行时,选择总是返回0

盖辉
2023-03-14
#define MY_TIMEOUT_S    5   
    int mySock;
    if ((mySock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("Cannot create UDP socket");
        return -1;
    }

    struct sockaddr_in myAddr;
    myAddr.sin_family       = AF_INET;
    myAddr.sin_port         = 0;
    myAddr.sin_addr.s_addr  = INADDR_ANY;
    memset(&(myAddr.sin_zero), '\0', 8);
    if (bind(mySock, (struct sockaddr*)&myAddr, 
            sizeof(struct sockaddr)) == -1) {
        perror("Cannot bind UDP socket to desired port");
        close(mySock);
        return -1;
    }

    // here send to remote target host on udp socket and port 

    char buf[MAX_UDP_PACKET_SIZE];
    struct sockaddr_in theirAddr;
    int addrLen = sizeof(struct sockaddr);

    fd_set readSet, curReadSet;
    FD_ZERO(&readSet);
    FD_SET(mySock, &readSet);
    int maxFD = mySock;
    while (true) {
        struct timeval timeOutTV = {MY_TIMEOUT_S, 0};

        memcpy(&curReadSet, &readSet, sizeof(fd_set));

        int selectRet = select(maxFD+1, &curReadSet, NULL, NULL, &timeOutTV);
        cout<<"select value =" <<selectRet<<endl;

        if (selectRet == -1) {
            if (errno == EINTR) {
                continue; // Interrupted by signal, retry
            }
            close(mySock);
            return -1;

        } else if (selectRet == 0) {
            close(mySock);
            return -1;
        }
        if (FD_ISSET(mySock, &curReadSet)) {
            int numBytes = recvfrom(mySock, buf, MAX_UDP_PACKET_SIZE, 0,
                    (struct sockaddr*)&theirAddr, (socklen_t*)&addrLen);
            if (numBytes == -1) {
                close(mySock);
            }   

        }
    }

目标16061根3R FIFO 0,8 0T0 153467管道
目标16061根4U IPv4 153470 0T0 UDP*:3290
目标16061根5U sock 0,6 0T0 153471无法识别协议
目标16061根6U IPv4 153472 0T0 TCP*:3290(LISTEN)
目标16061根7U raw 0t0 153473 00000000:0001->00000000:0000 ST=07

2)这是我在一个单独的exe中运行的上面的代码,其中只有这是在main中运行的代码,因为fd=3工作正常

sudo LSOF-A-P 16112

3)这是一个web服务器,我在这里集成了上面的代码,它独立工作,但不是现在

这是我的web服务器运行的输出

webServ 18431根3U unix 0xC09F9B00 0T0 157975套接字
webServ 18431根4U IPv4 157976 0T0 UDP*:8080
webServ 18431根5U IPv4 157977 0T0 TCP*:8080(LISTEN)

共有1个答案

彭鹭洋
2023-03-14

做那个:

int maxFD = mySock + 1;

select(2)的手册页说明:

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);

nfds是三个集合中编号最高的文件描述符,加上1。

 类似资料:
  • 我制作了一个带有阻塞套接字的小型套接字echo服务器(请参见下面的代码),但是select语句始终返回0,即使有消息要读取。其他的都管用。如果通过简单地将1赋给来替换select语句,则服务器可以工作。 服务器在虚拟机中运行在Ubuntu上,而客户端在主机系统上(Windows7 professional)。我的服务器IDE是Eclipse3.8,它使用OpenSSL1.0.1j。 要让这段代码工

  • 我有两张桌子,订单和订单项。我正在按日期制作销售报告,其中需要包括每个订单项目在每个日期的总成本价格和销售价格,以及每个订单在每个日期的总交付成本: 表:订单 表:orderitem 我正在寻找一个查询,它将提供以下输出: 我尝试了以下SQL: 问题是,我最终得到的交货价格乘以订单项目的数量,因此我希望对进行求和()<代码>交付在连接发生之前。

  • 原文是这样的: 这确实令人惊讶,但最终明白了(嗯,至少我想我明白了)为什么会这样发生。 现在,我将第二个更改为: 如果我遗漏了一些明显的东西,或者我的问题是愚蠢的,让我提前说声对不起。还有谢谢你!

  • 使用微软的剧作家,我有这个测试代码,工作: 我想把它分解成一个页面对象。我把它作为我的页面对象 作为我的测试: 但我明白了 这是为什么呢? 注意:如果需要的话,在节点16中使用本地es模块

  • app.py reg_account.html 错误: 我想让的结果在中的复选框未选中时返回False,但我不明白为什么当我勾选了该复选框时,结果可以存储到数据库中?我试着调试了几次,但还是找不到一个可能的解决方案,所以有没有人可以帮忙?

  • 问题内容: 假设我在同一台计算机上同时运行两个Java程序。这些程序将在单个JVM实例中运行还是在两个不同的JVM实例中运行? 问题答案: 如果您使用命令(从命令行)开始每个命令,它们将作为完全独立的JVM运行。 “程序”可以作为在一个JVM中运行的单独线程启动。