Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets 使用winsock:select创建单线程服务器提供套接字列表,我需要一个索引_Sockets_Select_Winsock_Handles_Single Threaded - Fatal编程技术网

Sockets 使用winsock:select创建单线程服务器提供套接字列表,我需要一个索引

Sockets 使用winsock:select创建单线程服务器提供套接字列表,我需要一个索引,sockets,select,winsock,handles,single-threaded,Sockets,Select,Winsock,Handles,Single Threaded,我已经用winsock函数创建了一个单线程服务器。 原则上它工作得很好,但我需要改进。 此服务器实现旨在运行在资源较低的嵌入式系统上,因此需要对其进行优化: 我的单线程正在处理所有连接的接收数据。所有插座均为非阻塞式且 我的接收函数如下所示(我提取了相关代码): fd_tmp=fd_read; iResult=select(0,&fd_tmp,NULL,NULL,0); 对于(u_int i=0;i

我已经用winsock函数创建了一个单线程服务器。 原则上它工作得很好,但我需要改进。 此服务器实现旨在运行在资源较低的嵌入式系统上,因此需要对其进行优化:

我的单线程正在处理所有连接的接收数据。所有插座均为非阻塞式且 我的接收函数如下所示(我提取了相关代码):

fd_tmp=fd_read;
iResult=select(0,&fd_tmp,NULL,NULL,0);
对于(u_int i=0;i
实际上代码运行得很好。但是每次接收数据时,我都需要在连接表中搜索与套接字相关的连接。这个循环在嵌入式系统上花费了太多的时间

我怎样才能避免这种情况? select()提供了其他信息吗?如果它能够提供表中的索引(我已将其作为参数提供),那就太完美了。 或者是否有可能强制accept使用预定义列表中的套接字句柄?如果套接字句柄将连续编号,我可以将其用作表中的索引

有什么想法吗


非常感谢

很抱歉,使用
select()无法执行此操作
。您的平台上还有其他套接字多路复用机制吗?您好,谢谢您的帮助。目前,我正在使用VS2010进行开发,并且正在使用winsock API。可能有不同的API,但我不知道。稍后,我将在带有BSD堆栈和/或lwIP堆栈的嵌入式、基于ARM的系统上实现相同的功能。我已经看到,select()的实现与BSD非常不同。在Windows上,您可以使用。我不知道如何在BSD系统上实现
select()
,但您可能想看看
kqueue()
。好的……我读了有关I/O完成端口的内容。似乎这只适用于WSA…-API,而不是标准套接字接口。我想,我需要重写我的大部分通信处理程序。我将在接下来的几天中尝试。
fd_tmp = fd_read;
iResult = select(0,&fd_tmp,NULL,NULL,0);
for ( u_int i = 0 ; i < fd_tmp.fd_count ; ++i )
{
    SOCKET actsock = fd_tmp.fd_array[i];
    // need to search for connection entry in table, which is related to receive socket
    int iConnRef = -1;
    for ( int i = 0 ; i < MAXNUM_CONNECTIONS ; ++i )
    {
       if ( asConnList[i].fValid && asConnList[i].sock == actsock )
       {
          iConnRef = i;
          break;
       }
    }

    if ( iConnRef != -1 )
    {
       // proceed with computing received data
       iResult = recv( actsock,(char*)&abRxBuffer[nOffs],nBytesRemaining, 0 );
       ...