Linux系统网络编程之用户数据报发送

http://tech.ddvip.com   2007年03月09日    社区交流

本文详细介绍Linux系统网络编程之用户数据报发送

  这个部分的知识,我们实际上可以写出大部分的基于TCP协议的网络程序了。我们可以去找一些源程序来参考一下。我们简单的学习一下基于UDP协议的网络程序。

  两个常用的函数  int recvfrom(int sockfd,void *buf,int len,
  unsigned int flags,struct sockaddr * from int *fromlen)
  int sendto(int sockfd,const void *msg,int len,
  unsigned int flags,struct sockaddr *to int tolen)

  sockfd,buf,len的意义和read,write一样,分别表示套接字描述符,发送或接收的缓冲区及大小.recvfrom负责从sockfd接收数据,如果from不是NULL,那么在from里面存储了信息来源的情况,如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL.sendto负责向to发送信息.此时在to里面存储了收信息方的详细资料.

  一个实例  /* 服务端程序 server.c */
  
  #include
  #include
  #include
  #include
  #include
  #define SERVER_PORT 8888
  #define MAX_MSG_SIZE 1024
  
  void udps_respon(int sockfd)
  {
  struct sockaddr_in addr;
  int addrlen,n;
  char msg[MAX_MSG_SIZE];
  
  while(1)
  { /* 从网络上度,写到网络上面去 */
  n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,
  (struct sockaddr*)&addr,&addrlen);
  msg[n]=0;
  /* 显示服务端已经收到了信息 */
  fprintf(stdout,"I have received %s",msg);
  sendto(sockfd,msg,n,0,(struct sockaddr*)&addr,addrlen);
  }
  }
  
  int main(void)
  {
  int sockfd;
  struct sockaddr_in addr;
  
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  if(sockfd<0)
  {
  fprintf(stderr,"Socket Error:%s
",strerror(errno));
  exit(1);
  }
  bzero(&addr,sizeof(struct sockaddr_in));
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr=htonl(INADDR_ANY);
  addr.sin_port=htons(SERVER_PORT);
  if(bind(sockfd,(struct sockaddr *)&ddr,sizeof(struct sockaddr_in))<0)
  {
  fprintf(stderr,"Bind Error:%s
",strerror(errno));
  exit(1);
  }
  udps_respon(sockfd);
  close(sockfd);
  }
  
  /* 客户端程序 */
  #include
  #include
  #include
  #include
  #include
  #include
  #define MAX_BUF_SIZE 1024
  
  void udpc_requ(int sockfd,const struct sockaddr_in *addr,int len)
  {
  char buffer[MAX_BUF_SIZE];
  int n;
  while(1)
  { /* 从键盘读入,写到服务端 */
  fgets(buffer,MAX_BUF_SIZE,stdin);
  sendto(sockfd,buffer,strlen(buffer),0,addr,len);
  bzero(buffer,MAX_BUF_SIZE);
  /* 从网络上读,写到屏幕上 */
  n=recvfrom(sockfd,buffer,MAX_BUF_SIZE,0,NULL,NULL);
  buffer[n]=0;
  fputs(buffer,stdout);
  }
  }
  
  int main(int argc,char **argv)
  {
  int sockfd,port;
  struct sockaddr_in addr;
  
  if(argc!=3)
  {
  fprintf(stderr,"Usage:%s server_ip server_port
",argv[0]);
  exit(1);
  }
  
  if((port=atoi(argv[2]))<0)
  {
  fprintf(stderr,"Usage:%s server_ip server_port
",argv[0]);
  exit(1);
  }
  
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  if(sockfd<0)
  {
  fprintf(stderr,"Socket Error:%s
",strerror(errno));
  exit(1);
  }
  /* 填充服务端的资料 */
  bzero(&addr,sizeof(struct sockaddr_in));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(port);
  if(inet_aton(argv[1],&addr.sin_addr)<0)
  {
  fprintf(stderr,"Ip error:%s
",strerror(errno));
  exit(1);
  }
  udpc_requ(sockfd,&addr,sizeof(struct sockaddr_in));
  close(sockfd);
  }
  
  ########### 编译文件 Makefile ##########
  all:server client
  server:server.c
  gcc -o server server.c
  client:client.c
  gcc -o client client.c
  clean:
  rm -f server
  rm -f client
  rm -f core

责编:豆豆技术应用

正在加载评论...