在我的程序中,工作者线程大概是这样的:{

for (;;)
{
b = GetQueuedCompletionStatus (g_hCompletionPort,&nBytesToBeRead,&nSocket,&lpo,INFINITE); if (b || lpo)
{
if (b)
{
                                    …
b = ReadFile ((HANDLE)nSocket,&ReadBuffer,nBytesToBeRead,&nBytesRead,&ol);
                                     /*这里用ReadFile根本无法获得来源IP和端口,如果在普通的socket编程下,recvfrom函数里有一个参数,这个参数里就有来源IP和端口,现在换成了ReadFile该如何获得来源IP和端口?IOCP的本意好象就是用WriteFile和ReadFile来完成高效的I/O收发,如果不用ReadFile时候效率会受到影响?如果不用ReadFile程序该如何改写?我在程序里将这里改为
                  sockaddr_in from;
memset(&from,0,sizeof(from));
int fromlen=sizeof(from);;
char recvbuf[512];
recvfrom(g_hSocket,recvbuf,nBytesToBeRead,0,(sockaddr*)&from,&fromlen);好象根本不对,在for()的无限循环中,怎么始终只能收到一次数据?*/
                                    …
                            }
                            …
                  }
                  …
         …
}请高人指点迷精

解决方案 »

  1.   

    你没试WSARecvFrom?这个是支持完成端口的
      

  2.   

    同意楼上,另外再加一点补充:
    在for的循环体之前先WSARecvFrom,这叫做初始话一下,不如你程序将堵在GetQueuedCompletionStatus 这里
      

  3.   

    WSARecvFrom它的最后一个参数不对啊,是一个指向IO COMPELTION ROUTING的东西,哪个是什么啊?还有,yanhuahui(眼发黑) 我没有加这个程序也没有堵在那里啊,我用完成端口,根本没必要用WSARecvFrom初始化啊。现在最主要的问题是,在什么地方用,WSARecvFrom来代替ReadFile,怎么用,我的其他地方需要不需要做修改?请指点
      

  4.   

    那个参数是用在另一种机制里的,这里用完成端口的话,只需要把这个参数设为NULL就可以了。至于怎么用WSARecvFrom来替代ReadFile,其实是一样的。只不过WSARecvFrom多了一个让你知道数据包来源的参数,并没什么实质性的改变。在实际应用中,你可以把WSARecvFrom和TCP中的那个accept看作是同样的类型,一开始运行就多发出几个异步请求,并尽量保证线程池中始终有WSARecvFrom等待以上仅限纸上谈兵,我没实际做过UDP的IOCP,有什么问题大家包涵,继续讨论
      

  5.   

    那它的哪个数组参数lpBuffers是怎么获得的?这里为什么回是数组?还有,我的程序里没有用线程池啊。如果我用 WSARecvFrom的话,那么我的
    socket需要不需要改成WSASocket()???是不是所有的这套函数都要改成增强版也就是WSA开头的版本的函数?
      

  6.   

    呵呵,不好意思,我看错了,我以为是WSARecv,用于做tcp包的,呵呵,抱歉,我也是只做过tcp的iocp,所以标题没看清就以为是tcp包
      

  7.   

    那个lpBuffers是你自己分配的,你只需要根据自己分配的缓冲设置WSABUF的参数就可以。MSDN中这个函数后面部分有比较详细的说明至于是否需要全部改为WSA*函数,按照MSDN中的说法应该是需要的。你自己也可以试试啊
      

  8.   

    还是没对,始终没对,在循环中将ReadFile()改为WSARecvFrom()整个程序就不能用了,连包都收不到了,怎么办啊?
      

  9.   

    socket应该不需要用wsa开头的吧?我用tcp做的都没用,一样运行得很好,ReadFile给我感觉不是很好用,呵呵,即使实现了操作也不太方便吧?
      

  10.   

    服务器不是Multi-CPU的话,IOCP的效率能比普通的SOCKET API高吗。