📄 linux网络编程--5. 用户数据报发送.html
字号:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>[ 永远的UNIX > Linux网络编程--5. 用户数据报发送 ]</title><style type="text/css"><!--body,th,input,select,textarea,select,checkbox{font:12pt 宋体}A:link { text-decoration:underline; color:#E6A306}A:visited { text-decoration:underline; color:#E6A306}A:hover { text-decoration:underline; color:#FFFF00}body { font-family: "宋体", "serif"; font-size: 12pt}td { font-family: "宋体", "serif"; font-size: 12pt}p { font-size: 9pt; line-height: 150%}--></style></head><body text="#ffffff" background="/images/bline.gif"><div align="center"><center><table border="0" width="70%" cellspacing="0" cellpadding="0" height="400"><tr> <td height="45"><p align="center"><img src="/images/title.gif" alt="[ 永远的UNIX::一个UNIX系统管理员的网上家园 ]"></td> </tr> <tr><tr> <td align=left height="40" valign=bottom align=left><small><a href="http://www.fanqiang.com">首页</a> > <a href=/a4/index.shtml>编程技术</a> > <a href=/a4/b7/index.html>网络编程</a> > 正文</small></td></tr><tr> <td width="100%" height="2" colspan="5" bgcolor="#D09F0D"><img src="/images/c.gif" width=1 height=1></td> </tr><tr> <td align=center height="40" valign=middle><font size=5><b>Linux网络编程--5. 用户数据报发送</b></font></td></tr><tr> <td align=center height="20"><font color=#999999><small>http://linuxc.51.net 作者:hoyt<hoytluo@21cn.com> (2001-05-08 11:21:31)</small></font></td></tr><td align=center><table border="0" width="80%" cellspacing="0" cellpadding="0" align=center><tr><td valign=top><font color=#cccccc>
<br> 我们前面已经学习网络程序的一个很大的部分,由这个部分的知识,我们实际上可以写出大部分的基于TCP协议的网络程序了.现在在Linux下的大部分程序都是用我们上面所学的知识来写的.我们可以去找一些源程序来参考一下.这一章,我们简单的学习一下基于UDP协议的网络程序.
<br>
<br>5.1 两个常用的函数
<br>
<br> int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr * from int *fromlen)
<br> int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct sockaddr *to int tolen)
<br>
<br>sockfd,buf,len的意义和read,write一样,分别表示套接字描述符,发送或接收的缓冲区及大小.recvfrom负责从sockfd接收数据,如果from不是NULL,那么在from里面存储了信息来源的情况,如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL.sendto负责向to发送信息.此时在to里面存储了收信息方的详细资料.
<br>
<br>
<br>5.2 一个实例
<br>
<br>/* 服务端程序 server.c */
<br>
<br>#include <sys/types.h>
<br>#include <sys/socket.h>
<br>#include <netinet/in.h>
<br>#include <stdio.h>
<br>#include <errno.h>
<br>#define SERVER_PORT 8888
<br>#define MAX_MSG_SIZE 1024
<br>
<br>void udps_respon(int sockfd)
<br>{
<br> struct sockaddr_in addr;
<br> int addrlen,n;
<br> char msg[MAX_MSG_SIZE];
<br>
<br> while(1)
<br> { /* 从网络上度,写到网络上面去 */
<br> n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,
<br> (struct sockaddr*)&addr,&addrlen);
<br> msg[n]=0;
<br> /* 显示服务端已经收到了信息 */
<br> fprintf(stdout,"I have received %s",msg);
<br> sendto(sockfd,msg,n,0,(struct sockaddr*)&addr,addrlen);
<br> }
<br>}
<br>
<br>int main(void)
<br>{
<br> int sockfd;
<br> struct sockaddr_in addr;
<br>
<br> sockfd=socket(AF_INET,SOCK_DGRAM,0);
<br> if(sockfd<0)
<br> {
<br> fprintf(stderr,"Socket Error:%s\n",strerror(errno));
<br> exit(1);
<br> }
<br> bzero(&addr,sizeof(struct sockaddr_in));
<br> addr.sin_family=AF_INET;
<br> addr.sin_addr.s_addr=htonl(INADDR_ANY);
<br> addr.sin_port=htons(SERVER_PORT);
<br> if(bind(sockfd,(struct sockaddr *)&ddr,sizeof(struct sockaddr_in))<0)
<br> {
<br> fprintf(stderr,"Bind Error:%s\n",strerror(errno));
<br> exit(1);
<br> }
<br> udps_respon(sockfd);
<br> close(sockfd);
<br>}
<br>
<br>
<br>/* 客户端程序 */
<br>#include <sys/types.h>
<br>#include <sys/socket.h>
<br>#include <netinet/in.h>
<br>#include <errno.h>
<br>#include <stdio.h>
<br>#include <unistd.h>
<br>#define MAX_BUF_SIZE 1024
<br>
<br>void udpc_requ(int sockfd,const struct sockaddr_in *addr,int len)
<br>{
<br> char buffer[MAX_BUF_SIZE];
<br> int n;
<br> while(1)
<br> { /* 从键盘读入,写到服务端 */
<br> fgets(buffer,MAX_BUF_SIZE,stdin);
<br> sendto(sockfd,buffer,strlen(buffer),0,addr,len);
<br> bzero(buffer,MAX_BUF_SIZE);
<br> /* 从网络上读,写到屏幕上 */
<br> n=recvfrom(sockfd,buffer,MAX_BUF_SIZE,0,NULL,NULL);
<br> buffer[n]=0;
<br> fputs(buffer,stdout);
<br> }
<br>}
<br>
<br>int main(int argc,char **argv)
<br>{
<br> int sockfd,port;
<br> struct sockaddr_in addr;
<br>
<br> if(argc!=3)
<br> {
<br> fprintf(stderr,"Usage:%s server_ip server_port\n",argv[0]);
<br> exit(1);
<br> }
<br>
<br> if((port=atoi(argv[2]))<0)
<br> {
<br> fprintf(stderr,"Usage:%s server_ip server_port\n",argv[0]);
<br> exit(1);
<br> }
<br>
<br> sockfd=socket(AF_INET,SOCK_DGRAM,0);
<br> if(sockfd<0)
<br> {
<br> fprintf(stderr,"Socket Error:%s\n",strerror(errno));
<br> exit(1);
<br> }
<br> /* 填充服务端的资料 */
<br> bzero(&addr,sizeof(struct sockaddr_in));
<br> addr.sin_family=AF_INET;
<br> addr.sin_port=htons(port);
<br> if(inet_aton(argv[1],&addr.sin_addr)<0)
<br> {
<br> fprintf(stderr,"Ip error:%s\n",strerror(errno));
<br> exit(1);
<br> }
<br> udpc_requ(sockfd,&addr,sizeof(struct sockaddr_in));
<br> close(sockfd);
<br>}
<br>
<br>########### 编译文件 Makefile ##########
<br>all:server client
<br>server:server.c
<br> gcc -o server server.c
<br>client:client.c
<br> gcc -o client client.c
<br>clean:
<br> rm -f server
<br> rm -f client
<br> rm -f core
<br>
<br>上面的实例如果大家编译运行的话,会发现一个小问题的. 在我机器上面,我先运行服务端,然后运行客户端.在客户端输入信息,发送到服务端, 在服务端显示已经收到信息,但是客户端没有反映.再运行一个客户端,向服务端发出信息 却可以得到反应.我想可能是第一个客户端已经阻塞了.如果谁知道怎么解决的话,请告诉我,谢谢. 由于UDP协议是不保证可靠接收数据的要求,所以我们在发送信息的时候,系统并不能够保证我们发出的信息都正确无误的到达目的地.一般的来说我们在编写网络程序的时候都是选用TCP协议的.
<br></font></td></tr><tr><td><hr></td></tr><form method=post action=/cgi-bin/find.cgi><tr><td><b>相关文章</b> 关键词 <input type=text name=key value='Linux网络编程'> <input type=submit value=搜索></td></tr></form><tr><td><a href=/a4/b7/20010508/112052.html>Linux网络编程--4. 完整的读写函数</a> <small>(2001-05-08 11:20:52)</small></font><br><a href=/a4/b7/20010508/112014.html>Linux网络编程--3. 服务器和客户机的信息函数</a> <small>(2001-05-08 11:20:14)</small></font><br><a href=/a4/b7/20010508/111934.html>Linux网络编程--2. 初等网络函数介绍(TCP)</a> <small>(2001-05-08 11:19:34)</small></font><br><a href=/a4/b7/20010508/111655.html>Linux网络编程--1. Linux网络知识介绍</a> <small>(2001-05-08 11:16:55)</small></font><br></td></tr><tr><td> </td></tr></table></td></tr><tr> <td width="100%" height="2" colspan="5" bgcolor="#D09F0D"><img src="/images/c.gif" width=1 height=1></td> </tr><tr> <td width="100%" height="40" colspan="5" valign=top><p align="center"><font color=#ffffff>© 樊强制作 欢迎分享 2001 </font></p></td> </tr></table></center></div><img src="/cgi-bin/pagehit.cgi?filename=a4/b7/20010508/112131.html" width=1 height=1></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -