/*客户端程序代码:先建立一个UDP套接字,然后使用循环将命令行传进来的字符串通过UDP套接字依次传送给服务器*/
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<stdio.h>
#include<unistd.h> /*close()*/
#include<string.h> /*memset()*/
#include<sys/time.h> /*select()*/
#define REMOTE_SERVER_PORT 1500
#define MAX_MSG 100
int main(int argc,char *argv[]){
int sd,rc,i;
struct sockaddr_in cliAddr,remoteServAddr;
struct hostent *h;
/*check command line args*/
if(argc<3){
printf("usage:%s <server><data1>...<data N>\n",argv[0]);
exit(1);
}
/*get server IP address(no check if input is IP address or DNS name)*/
h=gethostbyname(argv[1]);
if(h==NULL){
printf("%s:unkonwn host '%s'\n",argv[0],argv[1]);
exit(1);
}
printf("%s:sending data to '%s'(IP:%s)\n",argv[0],h->h_name,inet_ntoa(*(struct in_addr*)h->h_addr_list[0]));
remoteServAddr.sin_family=h->h_addrtype;
memcpy((char*)&remoteServAddr.sin_addr.s_addr,h->h_addr_list[0],h->h_length);
remoteServAddr.sin_port=htos(REMOTE_SERVER_PORT);
/*socket creation*/
sd=socket(AF_INET,SOCK_DGRAM,0);
if(sd<0){
printf("%s:cannot open socket \n",argv[0]);
exit(1);
}
/*bind any port*/
cliAddr.sin_family=AF_INET;
cliAddr.sin_addr.s_addr=htonl(INADDR_ANY);
cliAddr.sin_port=htons(0);
rc=bind(sd,(struct sockaddr*)&cliAddr,sizeof(cliAddr));
if(rc<0){
printf("%s:cannot bind port\n",argv[0]);
exit(1);
}
/*send data*/
for(i=2;i<argc;i++){
rc=sendto(sd,argv[i],strlen(argv[i]+1),0,());
}
}