/*---------------------------------------------------------------- * send-udp : send messages to a remote host, UDP-based *---------------------------------------------------------------- */ #include #include #include #include #include #include #include #define MSGSIZE 500 #ifndef IPPORT_MAX #define IPPORT_MAX 65535 /* max port number */ #endif #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 256 #endif main(argc,argv) int argc; char *argv[]; { extern int errno; extern char *sys_errlist[]; int sockfd, ok, addr_in_size; u_short portnum; struct sockaddr_in *to; struct hostent *toinfo; char *msg, htoname[MAXHOSTNAMELEN]; u_long toaddr; switch(argc) { case 1: fprintf(stdout,"Send messages to host: "); fscanf(stdin,"%s",htoname); fprintf(stdout,"on port number: "); fscanf(stdin,"%hu",&portnum); break; case 2: strcpy(htoname,argv[1]); fprintf(stdout,"Send messages to host %s on port number: ",argv[1]); fscanf(stdin,"%hu",&portnum); break; case 3: strcpy(htoname,argv[1]); portnum = (u_short)atoi(argv[2]); fprintf(stdout,"Send messages to host %s on port %d\n", argv[1],portnum); break; default: fprintf(stderr,"%s: wrong number of arguments \n",argv[0]); fprintf(stderr,"Usage: %s \n",argv[0]); exit(1); } if((portnum < IPPORT_RESERVED) || (portnum > IPPORT_MAX)){ fprintf(stderr,"%s: bad port number\n",argv[0]); exit(1); }; msg = (char *)malloc(MSGSIZE); to = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in)); if((toinfo = gethostbyname(htoname)) == NULL){ fprintf(stderr,"Error %d in gethostbyname: %s\n", errno,sys_errlist[errno]); exit(errno); }; toaddr = *(u_long *)toinfo->h_addr_list[0]; addr_in_size = sizeof(struct sockaddr_in); memset((char *)to,(char)0,addr_in_size); to->sin_family = AF_INET; to->sin_addr.s_addr = toaddr; to->sin_port = /*(htons)*/portnum; if((sockfd = socket (PF_INET, SOCK_DGRAM, 0)) == -1){ fprintf(stderr,"Error %d in socket: %s\n",errno,sys_errlist[errno]); exit(errno); }; ok = 1; while(ok){ fprintf(stdout,"Message: "); scanf("%s",msg); fprintf(stdout,"\n"); ok = (msg[0] != '0'); if(sendto(sockfd,msg,strlen(msg),0,(struct sockaddr *)to, addr_in_size) == -1){ fprintf(stderr,"Error %d in sendto: %s\n",errno,sys_errlist[errno]); exit(errno); } } } /*---------------------------------------------------------------- * rcv-udp : receive packets, UDP-based *---------------------------------------------------------------- */ #include #include #include #include #include #include #include #define MSGSIZE 500 #ifndef IPPORT_MAX #define IPPORT_MAX 65535 /* max port number */ #endif main(argc,argv) int argc; char *argv[]; { extern int errno; extern char *sys_errlist[]; int sockfd, cc, addr_in_size; u_short portnum; struct sockaddr_in *my_addr, *from; char *msg; u_long fromaddr; switch(argc){ case 1: fprintf(stdout,"Receive UDP packets on port number: "); fscanf(stdin,"%hu",&portnum); break; case 2: portnum = (u_short)atoi(argv[1]); fprintf(stdout,"Receive UDP packets on port number: %d\n",portnum); break; default: fprintf(stderr,"%s: wrong number of arguments \n",argv[0]); fprintf(stderr,"Usage: %s \n",argv[0]); exit(1); } if((portnum < IPPORT_RESERVED)|| (portnum > IPPORT_MAX)){ fprintf(stderr,"%s: bad port number\n",argv[0]); exit(1); }; addr_in_size = sizeof(struct sockaddr_in); msg = (char *)malloc(MSGSIZE); from = (struct sockaddr_in *)malloc(addr_in_size); my_addr = (struct sockaddr_in *)malloc(addr_in_size); memset((char *)my_addr,(char)0,addr_in_size); my_addr->sin_family = AF_INET; my_addr->sin_addr.s_addr = htonl(INADDR_ANY); my_addr->sin_port = portnum; if((sockfd = socket (PF_INET, SOCK_DGRAM, 0)) < 0){ fprintf(stderr,"Error %d in socket: %s\n",errno,sys_errlist[errno]); exit(errno); }; if(bind(sockfd, (struct sockaddr *)my_addr, addr_in_size) < 0){ fprintf(stderr,"Error %d in bind: %s\n",errno,sys_errlist[errno]); if(errno != EADDRINUSE) exit(errno); }; fprintf(stdout,"Ready to receive\n"); while(1){ if((cc = recvfrom (sockfd,msg,MSGSIZE,0,(struct sockaddr *)from, &addr_in_size)) == -1){ fprintf(stderr,"Error %d in recvfrom: %s\n", errno,sys_errlist[errno]); exit(errno); }; fromaddr = from->sin_addr.s_addr; msg[cc] = '\0'; fprintf(stdout,"From %s port %d: %s\n", (gethostbyaddr((char *)&fromaddr, sizeof(fromaddr), AF_INET))->h_name, from->sin_port,msg); } }