设为首页 加入收藏

TOP

基于Linux下的UDP编程(一)
2014-11-24 12:02:50 来源: 作者: 【 】 浏览:0
Tags:基于 Linux UDP 编程

一. Linux下UDP编程框架


使用UDP进行程序设计可以分为客户端和服务器端两部分。


1.服务器端程序包括:


建立套接字


将套接字地址结构进行绑定


读写数据


关闭套接字


2.客户端程序包括:


建立套接字


读写数据


关闭套接字


3.服务器端和客户端程序之间的差别


服务器端和客户端两个流程之间的主要差别在于对地址的绑定函数(bind()函数),而客户端可以不用进行地址和端口的绑定操作。




二.Linux中UDP套接字函数



从图可知,UDP协议的服务端程序设计的流程分为套接字建立,套接字与地址结构进行绑定,收发数据,关闭套接字;客户端程序流程为套接字建立,收发数据,关闭套接字等过程。它们分别对应socket(),bind(),sendto(),recvfrom(),和close()函数。


网络程序通过调用socket()函数,会返回一个用于通信的套接字描述符。Linux应用程序在执行任何形式的I/O操作的时候,程序是在读或者写一个文件描述符。因此,可以把创建的套接字描述符看成普通的描述符来操作,并通过读写套接字描述符来实现网络之间的数据交流。


1. socket


1> 函数原型:


int socket(int domain,int type,int protocol)


2> 函数功能:


函数socket()用于创建一个套接字描述符。


3> 形参:


domain:用于指定创建套接字所使用的协议族,在头文件


中定义。


常见的协议族如下:


AF_UNIX:创建只在本机内进行通信的套接字。


AF_INET:使用IPv4 TCP/IP协议


AF_INET6:使用IPv6 TCP/IP协议


说明:


AF_UNIX只能用于单一的UNIX系统进程间通信,而AF_INET是针对Interne的,因而可以允许在远程主机之间通信。一般把它赋为AF_INET。


type:指明套接的类型,对应的参数如下


SOCK_STREAM:创建TCP流套接字


SOCK_DGRAM:创建UDP数据报套接字


SOCK_RAW:创建原始套接字


protocol:


参数protocol通常设置为0,表示通过参数domain指定的协议族和参数type指定的套接字类型来确定使用的协议。当为原始套接字时,系统无法唯一的确定协议,此时就需要使用使用该参数指定所使用的协议。


4> 返回值:执行成功后返回一个新创建的套接字;若有错误发生则返回一个-1,错误代码存入errno中。


5> 举例:调用socket函数创建一个UDP套接字


int sock_fd;


sock_fd = socket(AF_INET,SOCK_DGRAM,0);


if(sock_fd < 0){


perror(“socket”);


exit(1);


}


2. bind


1> 函数原型:


int bind(int sockfd,struct sockaddr *my_addr,socklen_taddrlen)


2> 函数功能


函数bind()的作用是将一个套接字文件描述符与一个本地地址绑定在一起。


3> 形参:


sockfd:sockfd是调用socket函数返回的文件描述符;


addrlen是sockaddr结构的长度。


my_addr: 是一个指向sockaddr结构的指针,它保存着本地套接字的地址(即端口和IP地址)信息。不过由于系统兼容性的问题,一般不使用这个结构,而使用另外一个结构(struct sockaddr_in)来代替


4> 套接字地址结构:


(1)structsockaddr:


结构struct sockaddr定义了一种通用的套接字地址,它在


Linux/socket.h 中定义。


struct sockaddr{


unsigned short sa_family;/*地址类型,AF_XXX*/


char sa_data[14];/*14字节的协议地址*/


}


a. sin_family:表示地址类型,对于使用TCP/IP协议进行的网络编程,该值只能是AF_INET.


b. sa_data:存储具体的协议地址。


(2)sockaddr_in


每种协议族都有自己的协议地址格式,TCP/IP协议组的地址格式为结构体struct sockaddr_in,它在netinet/in.h头文件中定义。


struct sockaddr_in{


unsigned short sin_family;/*地址类型*/


unsigned short sin_port;/*端口号*/


struct in_addr sin_addr;/*IP地址*/


unsigned char sin_zero[8];/*填充字节,一般赋值为0*/


}


a. sin_family:表示地址类型,对于使用TCP/IP协议进行的网络编程,该值只能是AF_INET.


b. sin_port:是端口号


c. sin_addr:用来存储32位的IP地址。


d. 数组sin_zero为填充字段,一般赋值为0.


e. structin_addr的定义如下:


struct in_addr{


unsignedlong s_addr;


}


结构体sockaddr的长度为16字节,结构体sockaddr_in的长度为16字节。可以将参数my_addr的sin_addr设置为INADDR_ANY而不是某个确定的IP地址就可以绑定到任何网络接口。对于只有一IP地址的计算机,INADDR_ANY对应的就是它的IP地址;对于多宿主主机(拥有多个网卡),INADDR_ANY表示本服务器程序将处理来自所有网络接口上相应端口的连接请求


5> 返回值:


函数成功后返回0,当有错误发生时则返回-1,错误代码存入errno中。


6>举例:调用socket函数创建一个UDP套接字


struct sockaddr_in addr_serv,addr_client;/*本地的地址信息*/


memset(&serv_addr,0,sizeof(struct sockaddr_in));


addr_serv.sin_family = AF_INET;/*协议族*/


addr_serv.sin_port = htons(SERV_PORT);/*本地端口号*/


addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); /*任意本地地址*/
/*套接字绑定*/


if(bind(sock_fd,(struct sockaddr *)&addr_serv),sizeof(structsockaddr_in)) <0)


{


perror(“bind”);


exit(1);


}


3.close


1>函数原型:


int close(intfd);


2>函数功能:


函数close用来关闭一个套接字描述符。


3>函数形参:


参数fd为一个套接字描述符。


4>返回值:


执行成功返回0,出错则返回-1.错误代码存入errno中。


说明:


以上三个函数中,前两个要包含头文件


#include


#include


后一个包含:


#include


4.sendto


1>函数原型:


#include


#include


ssize_t sendo(ints,const void *msg,size_t len,int flags,const str

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux网络编程中的地址问题 下一篇基于Linux的TCP网络编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)