首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么根据收到的FD_READ判断来自哪一个SOCKET (OpenSSL达人也请)

2012-01-12 
如何根据收到的FD_READ判断来自哪一个SOCKET (OpenSSL达人也请) 这个问题是由OpenSSL引起的,因为我不知道

如何根据收到的FD_READ判断来自哪一个SOCKET (OpenSSL达人也请)

这个问题是由OpenSSL引起的,因为我不知道怎么用BIO来操作Overlapped   IO,所以我写了一个异步事件选择模型的服务器。我需要在接到FD_READ的时候判断出这次的数据来自哪个SOCKET,然后对这个SOCKET调用SSL_read函数。请问,怎么样才能知道现在要接收的数据来自哪个客户端对应的SOCKET?

如果有谁知道怎么在这种情况下用BIO,我另开贴送100分。。。

[解决办法]
异步消息选择机制不是允许你投递一个自定义消息么?
这个自定义消息的wParam附加参数就是套接字的句柄,你可以这样接收:

case WM_SOCKET: // 这是你的自定义消息
{
SOCKET s = (SOCKET)wParam;
switch(LOWORD(lParam)
{
case FD_READ:
...
break;
}
}
[解决办法]
你这个叫做WSAEventSelect模型,我说的哪个是以windows消息形式接收网络事件,你是TCP方式收发么?TCP里不是需要Accep吗?Accep不是返回一个新的连接套接口么?

返回一个新的连接套接口时你再调用 WSAEventSelect把FD_READ,FD_WRITE,FD_CLOSE事件跟你的网络事件关联起来就可以了嘛
[解决办法]
不是有个SOCKET数组和一个EVENT(事件)数组么?初始EVENTS总数(nEventTotal)是0,你用个循环来对每个处于等待的事件调用WSAWaitForMultipleEvents,是ACCEPT事件就得到一个新的套接口,把这个新的套接口存到这个SOCKET数组表里,每调用WSAEventSelect nEventTotal++,当有FD_CLOSE事件发生时关闭引发该事件对应的套接口然后移动数组元素(事件数组列表和套接口数组列表),并使nEventTotal--。
要看你对WSAEventSelect模型的熟练程度了,代码我就不写了,网上搜WSAEventSelect模型字样,一堆例子,这里给个连接你:
http://softsky.jblog.cn/54039.shtml,你一定能从里面找到答案的^_^
[解决办法]
接到FD_READ的时候没有参数告诉你是哪个socket的read事件?我觉得有点离谱。
[解决办法]
SSL_read,好象都是采用直接检索的方式,对于Overlapped IO,可能不太好处理。Overlapped IO是被动读,但是SSL_read是主动,除非使用事件模式进行隔离同步。
[解决办法]
其实曾经有考虑过接管SSL的那个通讯,不过也只是想想,因为要拆解出来的话,所有证书协议都要进行重新封装,感觉这个耗费没有太多的意义,事实上能够提高的性能也没太多,毕竟SSL的性能瓶颈,除非机器相当强,否则的话都在加密和解密上面,而不是网络I/O。

热点排行