学习Linux网络编程之终结篇

文章作者 100test 发表时间 2007:03:14 16:19:38
来源 100Test.Com百考试题网


  5.2 一个实例

  /* 服务端程序 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:%sn",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:%sn",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_portn",argv[0]).
  exit(1).
  }

  if((port=atoi(argv[2]))<0)
  {
  fprintf(stderr,"Usage:%s server_ip server_portn",argv[0]).
  exit(1).
  }

  sockfd=socket(AF_INET,SOCK_DGRAM,0).
  if(sockfd<0)
  {
  fprintf(stderr,"Socket Error:%sn",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:%sn",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

  上面的实例如果大家编译运行的话,会发现一个小问题的. 在我机器上面,我先运行服务端,然后运行客户端.在客户端输入信息,发送到服务端, 在服务端显示已经收到信息,但是客户端没有反映.再运行一个客户端,向服务端发出信息 却可以得到反应.我想可能是第一个客户端已经阻塞了.如果谁知道怎么解决的话,请告诉我,谢谢. 由于UDP协议是不保证可靠接收数据的要求,所以我们在发送信息的时候,系统并不能够保证我们发出的信息都正确无误的到达目的地.一般的来说我们在编写网络程序的时候都是选用TCP协议的。



相关文章


linux的域名解析系统设置
学习Linux网络编程之四
学习Linux网络编程之一
学习Linux网络编程之三
学习Linux网络编程之终结篇
光盘上的LinuxKnoppix5.0.1发布
SuseLinux10的启动过程(组图)
linux安全小常识-关闭不必要的服务
GRUB引导进单用户模式的三种方式 上
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛