文档详情

Linux程序设计 -第六章-Linux网络程序设计.ppt

发布:2020-04-26约2.53万字共112页下载文档
文本预览下载声明
. /*first step in udp programming*/ #include sys/types.h #include sys/socket.h #include arpa/inet.h #include stdio.h #define BUFLEN 255 int main(int argc,char **argv) { struct sockaddr_in peeraddr,localaddr; int sockfd; char recmsg[BUFLEN+1]; int socklen,n; if(argc!=5){ printf(%s dest IPaddress dest port source IPaddress source port\n,argv[0]); exit(0); } sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd0){ fprintf(stderr,socket creating error in udptalk.c!\n); exit(1); } socklen=sizeof(struct sockaddr_in); memset(peeraddr,0,socklen); peeraddr.sin_family=AF_INET; peeraddr.sin_port=htons(atoi(argv[2])); if(inet_pton(AF_INET,argv[1],peeraddr.sin_addr)=0){ printf(Wrong dest IP address!\n); exit(0); } memset(localaddr,0,socklen); localaddr.sin_family=AF_INET; localaddr.sin_port=htons(atoi(argv[4])); if(inet_pton(AF_INET,argv[3],localaddr.sin_addr)=0){ printf(Wrong source IP address!\n); exit(0); } if(bind(sockfd,localaddr,socklen)0){ fprintf(stderr,bind local address error in udptalk.c!\n); exit(2); } if(fgets(recmsg,BUFLEN,stdin)==NULL) exit(0); if(sendto(sockfd,recmsg,strlen(recmsg),0,peeraddr,socklen)0){ fprintf(stderr,sendto error in udptalk.c!\n); perror(); exit(3); } for(;;){ n=recvfrom(sockfd,recmsg,BUFLEN,0,peeraddr,socklen); if(n0){ fprintf(stderr,recvfrom error in udptalk.c\n); perror(); exit(4); } else{ recmsg[n]=0; printf(peer: %s,recmsg); } if(fgets(recmsg,BUFLEN,stdin)==NULL) exit(0); if(sendto(sockfd,recmsg,strlen(recmsg),0,peeraddr,socklen)0){ fprintf(stderr,sendto error in udptalk.c!\n); perror(); exit(3); } } } 对第一个UDP例程的思考 思考: 1. 只有来自对方IP和端口号的数据报才予以处理,如何过滤掉其它数据报? 2. 双方发送和接收交替进行,只要有一方发出数据报,对方阻塞的状态就能消除。如果一个数据报丢失,通信双方都在recvfrom中阻塞,永远等待。超时机制的设置? 对第一个UDP例程的思考 解决第一个问题: 接收数据后,加入对数据报地址的检验: if(memcmp(recvaddr,perraddr,socklen)!=0) continue; 这样就将来自其他地址的数据报拒之门外了。 对第一个UDP例程的思考 解决第二个问题: 前面提到的sock选项SO_RCVTIMEO就可以完成阻塞超时的设置。 在程序中加入: # include sys/time.h Struct
显示全部
相似文档