刚刚开始学习vc,在听孙鑫老师的视频教程,听到14课的网络编程时候,发现一个问题,就是我按照孙鑫老师讲的,也跟着他写的程序自己基本相当于又抄了一遍,抄在了新的文档中,但是当我运行服务器端程序的时候我发现在客户端程序还没有运行的时候服务器端就收到了数据,是一对乱码,不知道是什么原因阿??我把服务器端程序附在下面,请大家帮我这菜鸟看看!
#include<winsock2.h>
#include<iostream>
#include<studio.h>
using namespace std;int 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 socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN srvaddr;
srvaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(6000);
bind(socket,(SOCKADDR *)&srvaddr,sizeof(SOCKADDR));
char revbuf[100];
int len=sizeof(SOCKADDR);
SOCKADDR_IN clientaddr; recvfrom(socket,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
//cout<<revbuf;
printf("%s\n",revbuf); closesocket(socket);
WSACleanup();
}

解决方案 »

  1.   

    是不是别的程序往这个UDP端口发送的数据
    还有你这样输出接收到的字符串肯定是乱码
      

  2.   

    你这样写要在recvfrom那里写个死循环来等待接收数据,要不你这个运行一次接收完数据就退出了
      

  3.   

    我试过,加一个while(1),就完蛋了,程序一直出现乱码,还停不下来,等于一直在屏幕上打印乱码
      

  4.   

    你把revbuf清0就行,使用memset(recbuf,0,sizeof(revbuf));
    其实你没有收到数据,你加个变量判断recvfrom返回的值就行
    int ret=recvfrom(socket,revbuf,100,0,(SOCKADDR   *)&clientaddr,&len); 
    if(ret>0)printf("%s\n",revbuf);
    这样就不会出现打印语句了,除非收到数据 
      

  5.   

    出现乱码是因为你没有将recbuf初始化
    如果不初始化recbuf,它里面就是一些默认值,打印出来就是乱码
    可以使用memset(recbuf,0,sizeof(revbuf)); 将它初始化为0
      

  6.   

    recvfrom 后要判断 收到数据长度
    >0 才打印
      

  7.   

    问题是我把printf语句注释起来屏幕上都会出现“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”的乱码。这又是为什么阿
    疯了
      

  8.   

    应该还是什么地方有输出语句吧,你在好好看看
    在就是刚刚我写的初始化语句写错了,改正如下
    memset(revbuf,0,sizeof(revbuf));   
      

  9.   

    还是不行啊 我把程序这样调了一下 没有烫了 但是还是程序直接运行完毕了 没有等待接收数据阿 怎么才能让它等待接收数据 
    #include<winsock2.h>
    #include<iostream>
    #include<stdio.h>
    using namespace std;int 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 socketsrv=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN srvaddr;
    srvaddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.22");
    srvaddr.sin_family=AF_INET;
    srvaddr.sin_port=htons(4001);
    bind(socketsrv,(SOCKADDR *)&srvaddr,sizeof(SOCKADDR));
    char revbuf[100];
    int len=sizeof(SOCKADDR);
    SOCKADDR_IN clientaddr;
    //memset(revbuf,0,sizeof(revbuf));
    //recvfrom(socketsrv,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
    /* int ret=0;
    do 
    {
    ret=recvfrom(socketsrv,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
    }while(ret<=0);*/
    //cout<<revbuf;
    int ret=recvfrom(socketsrv,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
    if(ret>0)
    {
    printf("%s\n",revbuf); }
    closesocket(socketsrv);
    WSACleanup();
    }