在IOCP模型中,如果要同时处理大量的并发连接,网上说最好是使用 AcceptEx函数,并且用一个单独的线程来负责,所有的连接。我始终不知道如何去将用户的I/O和Connect分开。哪位能给一个简单代码的例子,感激不尽如果服务器使用IOCP模型,那么客户端是否一定要使用 WSASend函数,才能发送数据,是否可以使用 send函数。目前公司正要开发一个网络的程序,欢迎关于网络方面的朋友根我讨论,
Skype账号是 magicknife.prince
msn 账号是 [email protected]
Skype账号是 magicknife.prince
msn 账号是 [email protected]
解决方案 »
- 请教一个关于WaitCommEvent的问题
- LINK : fatal error LNK1104: 无法打开文件“0lepro32.lib”
- 散分100,庆祝升级,顺便竞猜一下今晚的法国VS瑞士……
- 能否用调光度的办法解决在WIN32下實現文字的淡入淡出效果???(背景颜色很复杂)
- msvcrt.dll是不是系统自带的?
- 怎样实现象《瑞星》一样的多语言切换?
- 怎么找不到CHtmlView
- 一个小问题,单色位图的调色板怎么做啊??急急如律令!!
- 获取Edit控件中光标位置,奇怪问题,请指点
- 哪位有讲解Tab Control用法的,不妨扔过来。
- 急问:找不到APPWZCHS.DLL是怎么回事?
- 关于ctreectrl节点前面的“+”
不是,客户端怎么会要知道服务器是怎么实现的?这是荒谬的!!使用 AcceptEx 和使用 WSASend 一样,调用以后,在调用 GetQueuedCompletionStatus 线程中如果是得到 AcceptEx 的响应,则说明连接已经完成。可以同时调用多个 AcceptEx 以增加同时接收连接的能力 -- 要保持这种能力请记住,当有一定连接完成时,要调用相应的 AcceptEx 去弥补这种能力
Server部分
typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
CHAR Buffer[DATA_BUFSIZE];
DWORD BytesSEND;
DWORD BytesRECV;
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;线程函数代码void ThreadFun(void* parameter)
{
...
while (TRUE)
{
// 完成端口有消息来了 ,这里第4个参数,使自己的结构亚,如果用send怎么传???
if (GetQueuedCompletionStatus(CompletionPort, & BytesTransferred,
(LPDWORD) & PerHandleData, (LPOVERLAPPED * ) & PerIoData, INFINITE) == 0 )
{
printf( " GetQueuedCompletionStatus failed with error %d\n " , WSAGetLastError());
return 0 ;
}
...省略代码
}
}
至于第二个问题,我的意思是使用一个专门的线程来处理,所有的客户端connet事件,因为大家知道 GetQueuedCompletionStatus函数,可以接受到包括 connect,wsasend,wsarecv等一系列的事件,我如何只让单独的一个线程来接受所有的 connect 事件,其他的线程来接受所有的i/o事件呢
==========================================
线程池的概念就是把一个人做事的模式clone到整个团队里面去,目的在于,不至于由于工作的分派,而导致因为工种配置不当而导致有部分人过于空闲,而另一部分人则过于繁忙。
typedef struct
{
OVERLAPPED Overlapped; //重叠结构
WSABUF DataBuf; //要发送的数据
CHAR Buffer[DATA_BUFSIZE]; //缓冲区
DWORD dwType; //类型
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;就用上面的结构来打个比方,如果我客户端使用异步 发送数据可以这样处理
PER_IO_OPERATION_DATA* p = GlobalAlloc(,sizeof(PER_IO_OPERATION_DATA));
p->DataBuf.buf = p->Buffer;
strcpy(p->Buffer,"hello,world");
p->dwType = 1; //1表示发送,0表示接受
WSASend(...);那么如果我使用send 函数,那么,就没有一个PER_IO_OPERATION_这样的结构,而是直接使用
send (,"helloworld",11,0);那么如果我的服务器是这样写的,会有什么后果呢?// 完成端口有消息来了
if (GetQueuedCompletionStatus(CompletionPort, & BytesTransferred,
(LPDWORD) & PerHandleData, (LPOVERLAPPED * ) & PerIoData, INFINITE) == 0 )
{
printf( " GetQueuedCompletionStatus failed with error %d\n " , WSAGetLastError());
return 0 ;
} switch(PerIoData -> dwType ) //如果用Send 那么这里不是要错吗?
{
case 1:case 2
}
***********************************你这得方法很不错,我当时也正好是这样想的。我的疑惑就在于 一个程序里面能够有多个完成端口吗?
unsigned(僵哥(学温州商人思路,做好事也要突出自己的利益点))
send (,"helloworld",11,0);那么如果我的服务器是这样写的,会有什么后果呢?// 完成端口有消息来了
if (GetQueuedCompletionStatus(CompletionPort, & BytesTransferred,
(LPDWORD) & PerHandleData, (LPOVERLAPPED * ) & PerIoData, INFINITE) == 0 )
{
printf( " GetQueuedCompletionStatus failed with error %d\n " , WSAGetLastError());
return 0 ;
} switch(PerIoData -> dwType ) //如果用Send 那么这里不是要错吗?
{
case 1:case 2
}