就是怎么知道是那个IP发来的数据包 
我的udp方式不是用的recvfrom ,而是GetQueuedCompletionStatus之后,调用的readfile,怎么弄?
通过GetQueuedCompletionStatus的这个lLPDWORD lpCompletionKey参数,能不能获得?

解决方案 »

  1.   

    DentistryDoctor   不是告诉你 用  socket的getpeername!
      

  2.   

    udp方式,我不知道是那个socket接受的啊,因为只有一个listen socket啊
      

  3.   

    通过这个全局的listen socket,不能得到对方的IP
      

  4.   

    char *pszAddr = inet_ntoa(netDev.t_udp_recvfrom.sin_addr);
      

  5.   

    关键是只有一个全局的socket在listen,并接受udp数据,用getpeername找不到传入的socket
      

  6.   

    解决办法:
    使用
    int WSARecvFrom(
      SOCKET s,
      LPWSABUF lpBuffers,
      DWORD dwBufferCount,
      LPDWORD lpNumberOfBytesRecvd,
      LPDWORD lpFlags,
      struct sockaddr* lpFrom,
      LPINT lpFromlen,
      LPWSAOVERLAPPED lpOverlapped,
      LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );
      struct sockaddr* lpFrom,这个参数就是。把这个参数加入到LPWSAOVERLAPPED 结构里,在GetQueuedCompletionStatus返回后可以取到。
    不要用ReadFile。
    ReadFile是Winsock2还没出来的时候的MS折衷办法,效率不高,经常要在USER MODE和KERNEL MODE里切换。
    而WSARecv WSARecvFrom WSASend WSASentTo这些都是专门优化过的,只要你的系统支持WINSOCK2
    就改用这个
      

  7.   

    使用WSARecvFrom ,出现10045错误