【问题标题】:using select to waiting for data on a client socket使用 select 在客户端套接字上等待数据
【发布时间】:2011-01-25 02:18:34
【问题描述】:

任何想法为什么当客户端等待选择时服务器写入套接字时,选择永远不会完成?

我正在使用 c 在套接字之间进行通信。我的客户端可以正常连接到我的服务器。

socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor
client->address.sin_addr.s_addr = inet_addr(ipAddress);
client->address.sin_family = AF_INET;
client->address.sin_port = htons(port);

bind(socket_desc,&address,sizeof(address));
connect(socket_desc, &address, sizeof(address));

当我使用 recv 来阻止和监听数据时,一切正常:

int bytesRead = 1;
while(bytesRead){
    int bufsize=1024;        
    char *buffer=malloc(bufsize);
    bytesRead = recv(socket_desc, buffer, bufsize, 0);
    printf("CLIENT RECV: %s", buffer);
}

如果我尝试使用 select,它似乎不会读取任何数据。如果我将 STDIN 添加到 fd_set,我可以强制它从套接字读取,但 select 似乎不会从 socket_desc 读取数据中触发...?

int running = 1;
while(running){
    /* wait for something to happen on the socket */
    struct timeval selTimeout;
    selTimeout.tv_sec = 2;       /* timeout (secs.) */
    selTimeout.tv_usec = 0;            /* 0 microseconds */
    fd_set readSet;
    FD_ZERO(&readSet);
    FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading
    FD_SET(socket_desc, &readSet);//tcp socket

    int numReady = select(3, &readSet, NULL, NULL, &selTimeout);
            //IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD
    if(numReady > 0){
        char buffer[100] = {'\0'};
        int bytesRead = read(socket_desc, &buffer, sizeof(buffer));
        printf("bytesRead %i : %s", bytesRead, buffer);
        if(bytesRead == 0){
            running = FALSE;
            printf("Shutdowning client.\n");

        }
    }

【问题讨论】:

    标签: c sockets select


    【解决方案1】:

    要选择的第一个参数应该是最大套接字 id 加 1。所以在你的情况下,它应该是

    socket_desc+1
    

    你可以试试看它是否有效?

    它只在您按下键盘上的键时才会出现的原因是因为 stdin 为 0,这将在 0 - (3 - 1) 范围内,这是检查的内容。如果将第一个参数设置为 socket_desc+1,则应检查 0 - (socket_desc) 范围内是否有就绪套接字

    【讨论】:

    • 另外请注意,在选择多个套接字时,您应该检查是否使用 FD_ISSET 设置了套接字 ID
    • 是的,做到了。我觉得很笨。接下来是 FD_ISSET。
    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多