在用完成端口走udp的时候,当接收数据包的时候不能象平时单线程的时候recvfrom可以得到对方的ip和port,那么比如作个udp的服务器的话,我接收到客户端的发送来得数据,我怎么回复给他们数据那,因为不知道他们的ip和端口丫,难道都是让他们先“注册”一下自己的端口和ip?要是让他们先“注册”的话岂不是又要开另外的一个线程负责处理这些注册信息。要是在接受数据结构里作‘注册’字段的话,要是客户端经过一次端口映射的话岂不是得不到他的正确ip和port?

解决方案 »

  1.   

    如果你是在设计一个c/s模式的程序,并且传输的数据格式可以自己定义的话,可以在对方发送来的数据中包含对方的ip等各种信息。例如,传输的数据结构可以如下定义:
    struct _DATA
    {
    char ip[32];
    char user[32]
    char password[32];
    char data[2048];
    }DATA;
    实践表明,一般情况下,4096大小以内的数据都是可以一次完全传送过来的。
    发送的时候:
    send(sockRecv,(char*)&DATA,sizeof(DATA),0);
    接收同理。
      

  2.   

    发射和接收都设置相应的字段来存贮数据。用户名密码ip port什么的。
      

  3.   

    但是自已的ip和port是私网有效的呀,怎么办呢?
      

  4.   

    howtotell(从何谈起) 我得贴子里说了你这种情况只有在没有经过映射的情况下有用,在经过一次以上的映射以后接收端收到的ip和端口就发生了变化了。
      

  5.   

    在UDP上用完成端口,未免杀鸡用牛刀了。
      

  6.   

    struct _DATA
    {
    char ip[32];
    char user[32]
    char password[32];
    char data[2048];
    }DATA;
    有点道理!
      

  7.   

    啊,原来UDP也可以用完成端口呀,学习
      

  8.   

    //----------------------------------------------------------------------------
    服务器端:
    typedef struct tagSOCKET_DATA
    {
    SOCKET hSocket;
    SOCKADDR_IN addr;
    CHAR szBuffer[RECV_BUFFER_SIZE];           WSABUF WsaBuf;
    DWORD dwBufLen;
    DWORD dwFlags;
    }PER_SOCKET_DATA, *PPER_SOCKET_DATA;完成端口等待函数:
    PPER_SOCKET_DATA pContext = NULL;
    if (!GetQueuedCompletionStatus(参数1, 参数2, (LPDWORD)&pContext, 参数4, 参数5) 
    {
    .......
    }
    如果有数据:
    &pContext->addr就能得到对方每一次的地址和端口号
    //----------------------------------------------------------------------------
      

  9.   

    要是我没有理解错的话,这个context结构的第一次的内容应该是你自己添进去的,比如tcp的连接建立以后你建立了一个新的context并且在里面添上你所想关心的内容,比如add,ip,flag,以后每次这个socket发生数据io的时候系统自动告诉你这次io发生socket的这个context。
    那么udp的时候你没有办法知道一开始他的ip和port也就没有办法添你所想关心的context。因为这个context不是系统给你添进去的,是你自己。
      

  10.   

    完成端口的数据有个投递过程,你可以在投递的时候把数据加入,昨天忘记写了
    WSARecvFrom(1, 2, 3, 4, (SOCKADDR*)&pContext->addr, 6, 7, 8, 9)
      

  11.   

    楼上的大哥,真是太感谢了,但是还有一点不明百。tcp的时候我在accept一个新的connect的时候投递一个context数据。但是走udp的时候我不需要accept什么东西,直接就可以接收对着我得ip,port的数据丫。我可以直接让socket在完成端口上接受数据就可以了丫,拿你这个投递怎么办?