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个左右,请问怎么解决?
...全文
341 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...
内容概要:本文围绕“面向高精度电流控制的PMSM多参数PSO辨识模型研究”,系统阐述了基于Simulink的永磁同步电机(PMSM)多参数辨识方法,重点采用粒子群优化算法(PSO)实现对电机关键内部参数的高精度辨识。研究构建了完整的PMSM控制系统仿真模型,结合智能优化算法,解决了传统参数辨识中精度低、收敛慢的问题,有效提升了电流环控制的动态性能与稳态精度。该方法特别适用于对控制精度和响应速度要求较高的工业应用场景,如高性能伺服系统、电动汽车驱动系统等,具有较强的工程实用价值和科研参考意义。文中提供了完整的Simulink仿真模型与配套代码,确保了研究内容的可复现性和实践操作性。; 适合人群:具备电机控制、自动化或电气工程等相关专业背景,熟悉MATLAB/Simulink仿真环境,从事电机驱动系统研发、控制算法设计或相关领域科研工作的工程师及研究生,尤其适合工作1-5年、希望深入理解先进参数辨识技术的研发人员。; 使用场景及目标:①开展高精度PMSM控制系统的设计与参数辨识研究;②学习并掌握PSO等智能优化算法在电机系统参数辨识中的具体实现与调优技巧;③完成学术论文复现、科研项目验证、毕业设计或工程原型开发,提升对现代电机控制核心技术的理解与应用能力。; 阅读建议:建议读者结合提供的Simulink模型与源代码进行动手实践,按照文档逻辑逐步搭建与调试仿真系统,重点关注PSO算法与电机模型的交互机制、目标函数设计及参数收敛过程,通过对比不同工况下的辨识结果,深入理解算法性能与控制精度之间的内在联系。

18,356

社区成员

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

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