⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cli_udp.c

📁 基于uclinux采用udp通讯协议实现图象等网络规范文件的传输.采用c/s模式,服务器端实现并发而响应多个客户的请求.经过测试,代码能在linux主机之间,arm与arm之间以及pc与arm之间进行
💻 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 + -