📄 cli_udp.c
字号:
#include"unixnet.h"#define MAXPACKET 64421int main(int argc,char **argv){ int conn_fd; int udp_fd; int fd; int write_bytes,recv_bytes=0,numbytes; socklen_t addrlen; struct sockaddr_in cli_addr,serv_addr; int ret; char buf[MAXPACKET]; char *ptr; fd_set r_fdset; struct timeval timer; struct timeval *ptimer; int max_fd; int n; if(argc!=2) { printf("Usage:cli<IP ADDRESS>\n"); exit(1); } fd=open("cpdd.jpg",O_CREAT|O_RDWR|O_EXCL); // fd=open("cpdd.bmp",O_CREAT|O_RDWR|O_EXCL); // fd=open("cpdd.tar.gz",O_CREAT|O_RDWR|O_EXCL); if(fd<0) { perror("cpdd.jpg"); exit(1); } bzero(&cli_addr,sizeof(cli_addr)); cli_addr.sin_family=AF_INET; cli_addr.sin_port=htons(SERVER_PORT); cli_addr.sin_addr.s_addr=htonl(INADDR_ANY); memset(&(cli_addr.sin_zero),'\0',8); udp_fd=socket(AF_INET,SOCK_DGRAM,0); //create udp_fd to receive datagram from the server side ret=bind(udp_fd,(struct sockaddr *)&cli_addr,sizeof(cli_addr)); if(ret<0) { perror("bind server port"); exit(1); } conn_fd=socket(AF_INET,SOCK_STREAM,0); //create conn_fd to send invitation to the server side bzero(&serv_addr,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVER_PORT); ret=inet_aton(argv[1],&serv_addr.sin_addr); if(ret==0) { fprintf(stderr,"inet_aton error\n"); exit(1); } ret=connect(conn_fd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)); if(ret==-1) { perror("client connect"); exit(1); } ptimer=NULL; while(1) { FD_ZERO(&r_fdset); FD_SET(udp_fd,&r_fdset); max_fd=udp_fd; ret=select(max_fd+1,&r_fdset,NULL,NULL,ptimer); switch(ret) { case -1: perror("select error"); printf("The client will exit\n"); exit(1); default: if(FD_ISSET(udp_fd,&r_fdset)) //udp socket happens { numbytes=recvfrom(udp_fd,buf,MAXPACKET,0,(struct sockaddr *)&serv_addr,&addrlen); printf("%s recv bytes:%d\n",inet_ntoa(serv_addr.sin_addr),numbytes); recv_bytes+=numbytes; ptr=buf; if(numbytes<0) { perror("recvfrom"); exit(1); } else if(numbytes==0) //receive the length of datagram 0 { close(fd); close(udp_fd); exit(0); } else { while((write_bytes=write(fd,ptr,numbytes))) { if((write_bytes==-1)&&(errno!=EINTR)) break; else if(write_bytes==numbytes) break; else if(write_bytes>0) { ptr+=write_bytes; numbytes-=write_bytes; } } } } break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -