1 / 94
文档名称:

简单的UDP服务器.doc

格式:doc   大小:427KB   页数:94页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

简单的UDP服务器.doc

上传人:cai.li.bin 2017/10/24 文件大小:427 KB

下载得到文件列表

简单的UDP服务器.doc

相关文档

文档介绍

文档介绍:这篇在赛迪网上找到的文章很不错,搭建一个简单的UDP服务器,我已经在linux9下编译通过了,可以正确运行,需要修改几个“”符号的小东东,我打算在它的基础上修改一下增加几个功能,以后再进行扩展吧。希望可以给找源代码的兄弟一点帮助。
 
如何实现在Linux下创建服务程序
作者:赵建军
Linux系统能提供强大可靠的网络服务,并有管理程序对服务进行管理。例如我们熟悉的Web、FTP和电子邮件等,它们既可以单独运行,d调用,而且运行得都非常好。但我们不能仅停留在赞叹中, 下面就给出两个服务程序程序和一个客户程序的例子,介绍服务程序和客户程序之间是如何沟通的。另外还要编辑配置一些文件,让服务程序也能接受服务管理程序管理。
这两个服务程序功能相同,但一个是独立服务程序,d调用的服务程序。这是TCP/IP网络服务的两大类,这里将两个程序放在一起是为了比较程序结构和运行方式。两服务程序都在Red Hat Linux 。
独立服务器
TCP和UDP是两大TCP/IP数据传输方式,套接口是建立服务器客户机连接的机制,首先介绍它们建立通信联系的过程,然后给出一个TCP服务程序例子。

对于TCP服务器端,服务程序首先调用建立套接口的函数socket(),然后调用绑定服务IP地址和协议端口号函数bind()。绑定成功后调用被动监听函数listen()等待客户连接,ept(),并一直阻塞到客户连接请求的到达,这个函数获取客户机IP地址和协议端口号。
对于TCP客户端,客户程序启动后后调用建立套接口函数socket(),然后调用连接函数connect(),此函数与服务器通过三次握手建立连接。
服务器和客户机建立连接后,就可以使用读函数read()和写函数write()收发数据了。数据交换完成后便各自调用关闭套接口函数close()删除套接口。TCP套接口通信方式见图1所示。
 
图1 TCP套接口通信方式
套接口通信方式
UDP程序与TCP的区别是无需建立连接。服务器首先启动,然后等待用户请求。客户机启动后便直接向服务器请求服务,服务器接到请求后给出应答。
对于UDP服务器端,服务程序首先调用套接口函数socket(),然后调用绑定IP地址和协议端口号函数bind()。之后调用函数recvfrom()接收客户数据,调用sendto()向客户发送数据。
对于UDP客户端,客户机程序启动后调用套接口函数socket(),然后调用sendto()向服务器发送数据,调用recvfrom()接收服务器数据。
双方数据交换成功后,各自调用关闭套接口函数close()关闭套接口。UDP套接口通信方式见图2所示。
 
图2 UDP套接口通信方式
下面给出独立服务程序的例子。这个程序虽然简单,但是与复杂程序有着相同的结构。
//程序名:
//功能:服务器从客户机读入一个字符,并将排在此字符后面的字符回送客户机
//服务器端口:9000
#include
#include
#include
#include
#include
#include
int main()
{
int pid;//用于存放fork()执行结果
int server_sockfd,client_sockfd;//用于服务器和客户机套接口描述符
int bind_flag,listen_flag;//用于存放bind()和listen()执行结果
int server_address_length,client_address_
length;//作为服务器客户机地址长变量
struct sockaddr_in server_address;//作为服务器地址结构变量(含地址和端口)
struct sockaddr_in client_address;//作为客户机地址结构变量(含地址和端口)
if((pid=fork())!=0) //用fork()产生新进程
exit(0) ;
setsid() ; //以子进程开始下面的程序
函数socket(),创建一个套接口,成功则返回套接口描述符。
server_sockfd=socket(,SOCK_STREAM,0);
if(server_sockfd<0)
{
printf(“socket error \n”);
exit(1);
}
=;
函数htonl()用于将32位主机字节顺序转换为网络字节顺序,其中参数INADDR_ANY表示任何IP地址。
ser