Sockets 使用winsock:select创建单线程服务器提供套接字列表,我需要一个索引
我已经用winsock函数创建了一个单线程服务器。 原则上它工作得很好,但我需要改进。 此服务器实现旨在运行在资源较低的嵌入式系统上,因此需要对其进行优化: 我的单线程正在处理所有连接的接收数据。所有插座均为非阻塞式且 我的接收函数如下所示(我提取了相关代码):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
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 );
...