设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: 刺猬宫 >> Linux专题 >> Linux 软件开发 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
Linux系统下Apache服务器…
巧用Tmpfs加速你的Linux…
Linux系统平台上文档服务…
Linux+Apache+Mysql+PHP…
Linux环境下邮件服务器软…
Linux系统的网络服务器配…
搭建Linux下的Squid代理…
Linux服务器网卡驱动安装…
Linux精华 Tomcat配置技…
Linux上安装Apache+Php+…
  Linux系统网络编程之用户数据报发送         
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\n",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\n",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\n",argv[0]); 

  exit(1); 

  } 

  

  if((port=atoi(argv[2]))<0) 

  { 

  fprintf(stderr,"Usage:%s server_ip server_port\n",argv[0]); 

  exit(1); 

  } 

  

  sockfd=socket(AF_INET,SOCK_DGRAM,0); 

  if(sockfd<0) 

  { 

  fprintf(stderr,"Socket Error:%s\n",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\n",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联盟收集整理

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-5-12 03:57:48
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持