您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页如何实现UDP编程及通讯方式_华清远见

如何实现UDP编程及通讯方式_华清远见

来源:百家汽车网


如何实现UDP编程及通讯方式

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。

既然有了保证可靠传输的TCP协议,为什么还要非可靠传输的UDP协议呢?主要的原因有两个。一是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。二是在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们

聊天用的ICQ和QQ就是使用的UDP协议。

UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt();* 可选

3、绑定IP地址、端口等信息到socket上,用函数bind();

4、循环接收数据,用函数recvfrom();

5、关闭网络连接;

UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt();* 可选

3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选

4、设置对方的IP地址和端口等属性;

5、发送数据,用函数sendto();

6、关闭网络连接;

UDP通讯服务器端源代码如下:

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

struct sockaddr_in s_addr;

struct sockaddr_in c_addr;

int sock;

socklen_t addr_len;

int len;

char buff[128];

/* 创建 socket , 关键在于这个 SOCK_DGRAM */

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {

perror(\"socket\");

exit(errno);

} else

printf(\"create socket.\\n\\r\");

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

/* 设置地址和端口信息 */

s_addr.sin_family = AF_INET;

if (argv[2])

s_addr.sin_port = htons(atoi(argv[2]));

else

s_addr.sin_port = htons(7838);

if (argv[1])

s_addr.sin_addr.s_addr = inet_addr(argv[1]);

else

s_addr.sin_addr.s_addr = INADDR_ANY;

/* 绑定地址和端口信息 */

if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) {

perror(\"bind\");

exit(errno);

} else

printf(\"bind address to socket.\\n\\r\");

/* 循环接收数据 */

addr_len = sizeof(c_addr);

while (1) {

len = recvfrom(sock, buff, sizeof(buff) - 1, 0,

(struct sockaddr *) &c_addr, &addr_len);

if (len < 0) {

perror(\"recvfrom\");

exit(errno);

buff[len] = '\\0';

printf(\"收到来自%s:%d的消息:%s\\n\\r\

inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff);

}

return 0;

}

客户端源代码如下:

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

struct sockaddr_in s_addr;

int sock;

int addr_len;

int len;

char buff[128];

/* 创建 socket , 关键在于这个 SOCK_DGRAM */

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {

perror(\"socket\");

exit(errno);

} else

printf(\"create socket.\\n\\r\");

/* 设置对方地址和端口信息 */

s_addr.sin_family = AF_INET;

if (argv[2])

s_addr.sin_port = htons(atoi(argv[2]));

else

s_addr.sin_port = htons(7838);

if (argv[1])

s_addr.sin_addr.s_addr = inet_addr(argv[1]);

else {

printf(\"消息必须有一个接收者!\\n\");

exit(0);

}

/* 发送UDP消息 */

addr_len = sizeof(s_addr);

strcpy(buff, \"hello i'm here\");

len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len);

if (len < 0) {

printf(\"\\n\\rsend error.\\n\\r\");

return 3;

}

printf(\"send success.\\n\\r\");

return 0;

}

编译程序用下列命令:

gcc -Wall simple-udpserver.c -o server

gcc -Wall simple-udpclient.c -o client

运行程序用下列命令:

./server 127.0.0.1 7838 启动服务器

./client 127.0.0.1 7838 启动客户端

如何实现UDP编程及通讯方式?看完以上内容,相信你可以学会。如需更多资料,欢迎前往华清远见的官网查看,更多精选资料提供参考和学习。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务