题目:编写UDP客户机程序向UDP服务器发送命令,并根据武夫器发送的数据做出响应,当UDP客户机向服务器发送getfile命令事,UDP武夫器向客户机发送指定文件input中的数据。我写的程序:我写的肯定是不能够运行出结果了,麻烦大家帮我指出我错在哪里,谢谢!
#include<fstream.h>
#include<iostream.h>
#include<string.h>
#include<time.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32")void main(int argc,char *argv[])
{
    if(argc!=4)
    {
        cout<<endl<<"请按以下格式输入命令行:UdpClient server_addr server_port command "<<endl;
        return;
    }
    WSADATA WSAData;
    if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
    {
        cout<<endl<<"WSAStartup初始化失败"<<endl;
        return;
    }
    SOCKET sock;
    sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    if(sock==INVALID_SOCKET)
    {
        cout<<endl<<"创建 Socket失败!"<<endl;
        return;
    }
    sockaddr_in serveraddr;
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons((unsigned short)atoi(argv[2]));
    serveraddr.sin_addr.S_un.S_addr=inet_addr(argv[1]);
  int serveraddrlen=sizeof(serveraddr);
     
    
    
    while(true)
    {
        char sendbuf[20];
        memset(sendbuf,'\0',sizeof(sendbuf));
        memcpy(sendbuf,"getfile",strlen("getfile"));
        int nSend;
        nSend=sendto(sock,sendbuf,sizeof(sendbuf),0,(sockaddr*) &serveraddr,serveraddrlen);
        if(nSend==SOCKET_ERROR)
        {
            cout<<endl<<"socket Send 失败!"<<endl;
            return;
        }
        cout<<endl<<"UDP client 发送命令:"<<sendbuf<<endl;        char recvbuf[1500];
        memset(recvbuf,'\0',sizeof(recvbuf));
    
    int nRecv;    nRecv=recvfrom(sock,recvbuf,sizeof(recvbuf),0,(sockaddr*) &serveraddr,&serveraddrlen);    if(strcmp(recvbuf,"getfile")==0)
    {
        fstream infile;
        infile.open("input",ios::in|ios::nocreate);
        infile.seekg(0,ios::end);
        int nlength=infile.tellg();
        infile.seekg(0,ios::beg);
        infile.read(recvbuf,nlength);
    }
cout<<"UDP client 接收数据:"<<recvbuf<<endl;
         if(nSend==SOCKET_ERROR)
        {
            cout<<endl<<"Socket Send 失败!"<<endl;
            return;
        }
        if(strcmp(sendbuf,"command ok")!=0)
            return;
    }
    cout<<endl<<"UDP client 发送数据完成";
    closesocket(sock);
    WSACleanup();}

解决方案 »

  1.   

     nRecv=recvfrom(sock,recvbuf,sizeof(recvbuf),0,(sockaddr*) &serveraddr,&serveraddrlen); 
    nSend=sendto(sock,sendbuf,sizeof(sendbuf),0,(sockaddr*) &serveraddr,serveraddrlen);
    最好不要用同一个serveraddrlen题目:编写UDP客户机程序向UDP服务器发送命令,并根据武夫器发送的数据做出响应,当UDP客户机向服务器发送getfile命令事,UDP武夫器向客户机发送指定文件input中的数据。 
    你的逻辑有问题,可以参考这个int send_command(SOCKET, buff, bufflen)
    {  return 返回值 //判断是否发送成功
    }int send_getfile();int recv_serviceData()main()
    {
      bool bFlag=true;//是否接收到getfile的标志  while()
     {
        send_command(SOCKET, buff, bufflen)
        recv_serviceData;
        if( 判断接收的数据是否为getfile,即bFlag判断 )
        {
            send_getfile();
            bFlag复位
        }
      }
    }