1 / 94
文档名称:

简单的UDP服务器.doc

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

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

分享

预览

简单的UDP服务器.doc

上传人:phl808 2017/2/28 文件大小:427 KB

下载得到文件列表

简单的UDP服务器.doc

相关文档

文档介绍

文档介绍:这篇在赛迪网上找到的文章很不错,搭建一个简单的 UDP 服务器,我已经在 linux9 下编译通过了,可以正确运行,需要修改几个“”符号的小东东,我打算在它的基础上修改一下增加几个功能,以后再进行扩展吧。希望可以给找源代码的兄弟一点帮助。如何实现在 Linux 下创建服务程序作者:赵建军 Linux 系统能提供强大可靠的网络服务,并有管理程序对服务进行管理。例如我们熟悉的 Web 、FTP 和电子邮件等,它们既可以单独运行,也可以被守护进程 inetd 调用,而且运行得都非常好。但我们不能仅停留在赞叹中, 下面就给出两个服务程序程序和一个客户程序的例子,介绍服务程序和客户程序之间是如何沟通的。另外还要编辑配置一些文件,让服务程序也能接受服务管理程序管理。这两个服务程序功能相同,但一个是独立服务程序,另一个是被 inetd 调用的服务程序。这是 TCP/IP 网络服务的两大类,这里将两个程序放在一起是为了比较程序结构和运行方式。两服务程序都在 Red Hat Linux 和TurboLinux 上调试通过。独立服务器 TCP 和UDP 是两大 TCP/IP 数据传输方式,套接口是建立服务器客户机连接的机制,首先介绍它们建立通信联系的过程,然后给出一个 TCP 服务程序例子。 套接口通信方式对于TCP 服务器端,服务程序首先调用建立套接口的函数 socket() ,然后调用绑定服务 IP地址和协议端口号函数 bind() 。绑定成功后调用被动监听函数listen() 等待客户连接,还要调用获取连接请求函数 accept() ,并一直阻塞到客户连接请求的到达,这个函数获取客户机 IP地址和协议端口号。对于 TCP 客户端,客户程序启动后后调用建立套接口函数 socket() ,然后调用连接函数 connect() ,此函数与服务器通过三次握手建立连接。服务器和客户机建立连接后,就可以使用读函数 read() 和写函数 write() 收发数据了。数据交换完成后便各自调用关闭套接口函数 close() 删除套接口。 TCP 套接口通信方式见图 1所示。图1TCP 套接口通信方式 套接口通信方式 UDP 程序与 TCP 的区别是无需建立连接。服务器首先启动,然后等待用户请求。客户机启动后便直接向服务器请求服务,服务器接到请求后给出应答。对于 UDP 服务器端,服务程序首先调用套接口函数 socket() ,然后调用绑定 IP地址和协议端口号函数 bind() 。之后调用函数 recvfrom() 接收客户数据, 调用 sendto() 向客户发送数据。对于 UDP 客户端,客户机程序启动后调用套接口函数 socket() ,然后调用 sendto() 向服务器发送数据,调用 recvfrom() 接收服务器数据。双方数据交换成功后,各自调用关闭套接口函数 close() 关闭套接口。 UDP 套接口通信方式见图 2所示。图2UDP 套接口通信方式下面给出独立服务程序的例子。这个程序虽然简单,但是与复杂程序有着相同的结构。//程序名: //功能:服务器从客户机读入一个字符,并将排在此字符后面的字符回送客户机//服务器端口: 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位主机字节顺序转换为网络