udp绑定端口,和发送数据的端口居然不一样,比如我在客户端绑定到20000端口,服务器端绑定到30000端口,服务器收到客户端的数据,分析出来的端口是随机的,不是20000;同样,客户端收到服务器端的数据,分析出来的端口也是随机的,不是30000。何解?谢谢

解决方案 »

  1.   

    #include <winsock2.h>
    #include <stdio.h>
    #pragma comment (lib,"WS2_32.lib")
    BOOL InitWinsock();
    void main()
    {
    SOCKET socket1; InitWinsock();
    struct sockaddr_in local;
    struct sockaddr_in from;
    int fromlen =sizeof(from);
    local.sin_family=AF_INET;
    local.sin_port=htons(30000);             ///监听端口
    local.sin_addr.s_addr=INADDR_ANY;       ///本机 socket1=socket(AF_INET,SOCK_DGRAM,0); bind(socket1,(struct sockaddr*)&local,sizeof local); while (1)
    {
    char buffer[1024]="\0";
    printf("waiting for message from others-------------\n");
    if (recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
    {
    printf("Received datagram from %s--%d--%s\n",inet_ntoa(from.sin_addr),from.sin_port,buffer);
    ////给cilent发信息
    sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,fromlen); }
    Sleep(500);
    } closesocket(socket1);
    }BOOL InitWinsock()
    {
    int Error;
    WORD VersionRequested;
    WSADATA WsaData;
    VersionRequested=MAKEWORD(2,2);
    Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
    if(Error!=0)
    {
    return FALSE;
    }
    else
    {
    if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
    {
    WSACleanup();
    return FALSE;
    }

    }
    return TRUE;
    }
      

  2.   

    #include <winsock2.h>
    #include <stdio.h>
    #pragma comment (lib,"WS2_32.lib") 
    BOOL InitWinsock();
    void main()
    {
    SOCKET socket1; InitWinsock();
    struct sockaddr_in server;
    struct sockaddr_in local;
    int len =sizeof(server);
    server.sin_family=AF_INET;
    server.sin_port=htons(30000);                      ///server的监听端口
    server.sin_addr.s_addr=inet_addr("172.18.20.222"); ///server的地址  socket1=socket(AF_INET,SOCK_DGRAM,0);
    local.sin_family=AF_INET;
    local.sin_port=htons(20000);
    local.sin_addr.s_addr=INADDR_ANY;
    bind(socket1,(struct sockaddr*)&local,sizeof local);
    while (1)
    { char buffer[1024]="\0";
    printf("input message\n");
    scanf("%s",buffer);
    if (strcmp(buffer,"bye")==0)
    break;
    if (sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)
    {
    if (recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,&len)!=SOCKET_ERROR)
    printf("rece from server:%s--%d--%s\n",inet_ntoa(server.sin_addr),server.sin_port,buffer);
    }
    }
    closesocket(socket1);
    }BOOL InitWinsock()
    {
    int Error;
    WORD VersionRequested;
    WSADATA WsaData;
    VersionRequested=MAKEWORD(2,2);
    Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
    if(Error!=0)
    {
    return FALSE;
    }
    else
    {
    if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
    {
    WSACleanup();
    return FALSE;
    }

    }
    return TRUE;
    }
      

  3.   

    printf("rece from server:%s--%d--%s\n",inet_ntoa(server.sin_addr),server.sin_port,buffer);
    ////////////////////////////////////////////////////////
    printf("rece from server:%s--%d--%s\n",inet_ntoa(server.sin_addr),ntohs(server.sin_port),buffer);
      

  4.   

    Server和Client之间有没有防火墙?特别是NAT?有的话会自动分配的。
      

  5.   

    udp绑定端口,和发送数据的端口居然不一样,
    比如我在客户端绑定到20000端口,服务器端绑定到30000端口,服务器收到客户端的数据,
    分析出来的端口是随机的,不是20000;同样,客户端收到服务器端的数据,分析出来的端口也是随机的,
    不是30000。何解?谢谢
    呵呵,你绑定端口是因为这个绑定的端口是监听信息的端口,就是说数据接受是用这个的,但是发送你固定了么~?
    所以当然是随机的啊~:)
    udp不像TCP一样建好链接后,发送接受都是用建立链接后的端口~:)
    -----------------------------------------------------------------------------------------------------------------------------------------
    CSDN小猪手:方便查看,快速回复~~速度++~~~
    下载:
    http://www.vickyjam.com/blog/lbs/article.asp?id=165