MFC socket selectFD_SETSIZE的限制问题

weileCNM 2014-03-17 03:53:22
我在包含头文件#include <WINSOCK2>加了#define FD_SETSIZE 1024,但是为什么我的FD_SET对象中的socket fd_array[FD_SETSIZE]数组长度还是64不是1024,这样socket的客户端数量还是被限制了,我现在客户端要有500个左右,请问怎么解决?
...全文
275 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
smilestone322 2015-08-11
  • 打赏
  • 举报
回复
引用 6 楼 weileCNM 的回复:
[quote=引用 4 楼 VisualEleven 的回复:] 把#define FD_SETSIZE 1024定义放在 #include <winsock2.h>的前面
我这样做了,刚才打错了,是winsocke2前面,数组长度是64。[/quote] 是不是你有多个文件 #include <winsock2.h>
徐凡华 2015-01-17
  • 打赏
  • 举报
回复
if( WSASend(pClient->sock, &wbuf, 1, &dwBytes, 0, &pUnit->ov, NULL) ) 直接调用WSASend发送。因为sock已与完成端口绑定
weileCNM 2014-03-18
  • 打赏
  • 举报
回复
我怎样告知这个函数GetQueuedCompletionStatus我要发送数据?我看都是读数据的?
FirryHere 2014-03-17
  • 打赏
  • 举报
回复
尝试用完成端口吧,select在并发量大的时候,效率很差的;完成端口(iocp)实例如下:不是完整的,:) while( !m_bTerminateWorkThread ) { // µÃµœÍê³É׎̬ nResult = GetQueuedCompletionStatus(m_hCompletionPort, &dwBytesComp, (DWORD*)&pClient, &pOverlapped, X_SLEEP_TIME); if( !pOverlapped ) continue; pUnitGot = CONTAINING_RECORD(pOverlapped, tagUnit, ov); if( EXS_Accept == pUnitGot->eState ) // accept¹ý³Ì { pClient = (tagXClient*)(((tagXLoginParam*)(&pUnitGot->pBuffer[PARAM_INDEX]))->dwHandle); InterlockedDecrement((LONG*)&m_nAcceptExs); // ÔÙŽŽœšAcceptEx SetEvent(m_hEventAccepEx); } if( !nResult ) // Íê³É¶Ë¿ÚÊÕµœÊ§°ÜÍšÖª { DWORD dwErrorCode = GetLastError(); if (ERROR_NETNAME_DELETED != dwErrorCode && ERROR_OPERATION_ABORTED != dwErrorCode) { if(P_VALID(pClient)) { m_pLog->Write(_T("kick r iocp err:%u, client lSendCast:%u, clientID:%u, bShutdown:%d\r\n"), dwErrorCode, pClient->lSendCast, pClient->dwClientID, pClient->bShutDown); } else { m_pLog->Write(_T("kick r iocp err:%u, client lSendCast:%u\r\n"), dwErrorCode); } } switch(dwErrorCode) { case ERROR_IO_PENDING: case ERROR_IO_INCOMPLETE: break; default: PreDestroyClient(pClient, pUnitGot,dwErrorCode); break; } continue; } switch( pUnitGot->eState ) { case EXS_Accept:
weileCNM 2014-03-17
  • 打赏
  • 举报
回复
引用 4 楼 VisualEleven 的回复:
把#define FD_SETSIZE 1024定义放在 #include <winsock2.h>的前面
我这样做了,刚才打错了,是winsocke2前面,数组长度是64。
weileCNM 2014-03-17
  • 打赏
  • 举报
回复
引用 2 楼 my3439955 的回复:
用完成端口吧,不然仅仅是调大FD_SETSIZE也会带来轮询效率问题
完成端口没做过,select模式效率会很差吗?
Eleven 2014-03-17
  • 打赏
  • 举报
回复
把#define FD_SETSIZE 1024定义放在 #include <winsock2.h>的前面
weileCNM 2014-03-17
  • 打赏
  • 举报
回复
我自己的工程文件是这样
#define FD_SETSIZE
#include <winsock.h>


//winsock2.h中是这样的
#ifndef FD_SETSIZE
#define FD_SETSIZE 64
#endif /* FD_SETSIZE */

typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;

按理说我在包含这个头文件前重定义了就行了,而且我试过直接把值改成528还是没有效果
  • 打赏
  • 举报
回复
用完成端口吧,不然仅仅是调大FD_SETSIZE也会带来轮询效率问题
yaozhiyong110 2014-03-17
  • 打赏
  • 举报
回复
那是你定义的在socket fd_array[FD_SETSIZE]这句之前又定义了 你应该在系统定义的后面重新定义FD_SETSIZE...

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧