题目:编写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();}
#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();}
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复位
}
}
}