本帖最后由 VisualEleven 于 2010-10-19 10:03:09 编辑

解决方案 »

  1.   

    你说的程序无响应,应该是阻塞在recvfrom函数中了吧
      

  2.   

    bind之后要listen啊,当有连接到来的时候,你再给他发送数据,然后你那边的recvfrom才能收到啊建议看看孙鑫的vc视频教程
      

  3.   

    UdpSrv.cpp#include <Winsock2.h>
    #include <stdio.h>void main()
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
    return;
    }
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
            HIBYTE( wsaData.wVersion ) != 1 ) {
    WSACleanup( );
    return; 
    } SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    char recvBuf[100]; recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
    printf("%s\n",recvBuf);
    closesocket(sockSrv);
    WSACleanup();
    }
      

  4.   

    UdpClient.cpp#include <Winsock2.h>
    #include <stdio.h>void main()
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
    return;
    }
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
            HIBYTE( wsaData.wVersion ) != 1 ) {
    WSACleanup( );
    return; 
    } SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000); sendto(sockClient,"Hello",strlen("Hello")+1,0,
    (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
    closesocket(sockClient);
    WSACleanup();
    }
      

  5.   


    要怎么解决啊?我觉得也是阻塞在这了,但是不知道怎么解决,帮忙一下吧!基于UDP的不用listen啊,孙鑫的看过了!
      

  6.   


    这个地方我说错了,需要listen的应该是TCP吧
    UDP不需要?这个我也不太清楚,我看了一下TCP的,是需要listen的
      

  7.   

    if( recvfrom(socksrv,recvBuf,100,0,(SOCKADDR*)&addrclient,&len)>0){ i=1;Display();}
       if(j==1){sendto(socksrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrclient,len);Display();}这个地方recv和sendto顺序是不是反了啊
      

  8.   

    这个很容易发现问题啊,你在recvfrom的地方打个断点,Debug下F5,看看程序是否在这里阻塞了不就清楚了。
    一般的话是放在一个单独的线程中去recvfrom接收数据,这样不至于把界面卡死
      

  9.   

    如何用    u_long iMode = 1;
        ioctlsocket(socksrv, FIONBIO, &iMode);
    把阻塞模式改为非阻塞模式,为什么也不成呢?
      

  10.   

    socksrv=socket(AF_INET,SOCK_DGRAM,0);
    最后一个参数错了。0用于IP,UDP不用这个。