Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用select and accept启动新文件描述符_C_Sockets_Client Server - Fatal编程技术网

使用select and accept启动新文件描述符

使用select and accept启动新文件描述符,c,sockets,client-server,C,Sockets,Client Server,场景:当选择detect activity in one socket时,我的代码中会出现以下条件。 伪代码: after select i am checking in if stdin f descriptor do something else if listening file descriptor newFDescriptor = accept sockFDescriptor, (struct sockaddr *) &clientAddress, &cli

场景:当选择detect activity in one socket时,我的代码中会出现以下条件。

伪代码:

after select i am checking in
if stdin f descriptor
    do something

else if listening file descriptor
newFDescriptor = accept sockFDescriptor, (struct sockaddr *) &clientAddress, &clientAddressSize

FD_SET (new file descriptor)
send connected response to peer

// data from connected peer
else {
    receive data
}
但每次我从一个对等方发送东西到另一个对等方时,它都会用新的filedescriptor创建新的连接。i、 e.它不会在已为此对等方创建的filedescriptor中重新格式化数据。 已创建对等1到对等2的新文件描述符 对等点1到对等点2再次建立新连接
它正在接收侦听文件描述符上的所有数据。

我同意jedwards+1的说法-您应该阅读Beej指南来开始

同时,这里有一些快速输入,可能有助于避免您遇到的错误。我猜你把文件描述符弄混了

您需要将新的文件描述符(accept调用中的描述符)添加到列表中,然后使用它们来填充下一个select调用的fd集。侦听器fd仅用于建立新连接和后续接受-您不应该在该fd上调用receive或send,让我们称之为server\u fd

下面是一个快速示例代码,它将所有连接存储在一个数组中,然后您可以按如下方式设置fd。对于没有有效fd的数组索引,它使用-1

FD_ZERO(&read_fd_set);
/* Set the fd_set before passing it to the select call */
for (i=0;i < MAX_CONNECTIONS;i++) {
   if (all_connections[i] >= 0) {
       FD_SET(all_connections[i], &read_fd_set);
   }
}

ret_val = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL);
一旦select返回,您可以检查带有read事件的fd是否是服务器fd,如果是,您可以调用accept来获取新的fd—您需要将其添加到阵列中。大概是这样的:

if (FD_ISSET(server_fd, &read_fd_set)) { 
    new_fd = accept(server_fd, (struct sockaddr*)&new_addr, &addrlen);
    if (new_fd >= 0) {
        printf("Accepted a new connection with fd: %d\n", new_fd);
        for (i=0;i < MAX_CONNECTIONS;i++) {
             if (all_connections[i] < 0) {
                 all_connections[i] = new_fd; 
                 break;
             }
        }
    }
} 

我同意jedwards+1-你应该阅读Beej的指南来开始

同时,这里有一些快速输入,可能有助于避免您遇到的错误。我猜你把文件描述符弄混了

您需要将新的文件描述符(accept调用中的描述符)添加到列表中,然后使用它们来填充下一个select调用的fd集。侦听器fd仅用于建立新连接和后续接受-您不应该在该fd上调用receive或send,让我们称之为server\u fd

下面是一个快速示例代码,它将所有连接存储在一个数组中,然后您可以按如下方式设置fd。对于没有有效fd的数组索引,它使用-1

FD_ZERO(&read_fd_set);
/* Set the fd_set before passing it to the select call */
for (i=0;i < MAX_CONNECTIONS;i++) {
   if (all_connections[i] >= 0) {
       FD_SET(all_connections[i], &read_fd_set);
   }
}

ret_val = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL);
一旦select返回,您可以检查带有read事件的fd是否是服务器fd,如果是,您可以调用accept来获取新的fd—您需要将其添加到阵列中。大概是这样的:

if (FD_ISSET(server_fd, &read_fd_set)) { 
    new_fd = accept(server_fd, (struct sockaddr*)&new_addr, &addrlen);
    if (new_fd >= 0) {
        printf("Accepted a new connection with fd: %d\n", new_fd);
        for (i=0;i < MAX_CONNECTIONS;i++) {
             if (all_connections[i] < 0) {
                 all_connections[i] = new_fd; 
                 break;
             }
        }
    }
} 

如果对等方坚持创建新连接,那么在服务器端您将无能为力


它正在接收侦听文件描述符上的所有数据,但开始没有意义。这是不可能的。侦听文件描述符除了接受连接外,无法执行任何操作。

如果对等方坚持创建新连接,则在服务器端对此您无能为力


它正在接收侦听文件描述符上的所有数据,但开始没有意义。这是不可能的。侦听文件描述符除了接受连接之外无法执行任何操作。

很难理解您的要求,但我强烈建议对C套接字感兴趣的任何人在线免费使用它。很难理解你在问什么,但我强烈建议对C套接字感兴趣的人在线免费使用。