【TCP/IP】基于UDP的服务器端/客户端实现 II - 实践与实现

news/2024/11/15 3:47:49/

基于UDP的回声服务器端/客户端

        结合之前基于TCP实现的回声服务器,我们尝试再用UDP来完成对回声服务器/客户端的设计。

echo_server:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30
void error_handling(char *message);int main(int argc, char *argv[])
{int serv_sock;char message[BUF_SIZE];int str_len;socklen_t clnt_adr_sz;struct sockaddr_in serv_adr, clnt_adr;if(argc!=2){printf("Usage : %s <port>\n", argv[0]);exit(1);}//创建UDP套接字,向socket函数第二个参数传递SOCK_DGRAMserv_sock=socket(PF_INET, SOCK_DGRAM, 0);if(serv_sock==-1)error_handling("UDP socket 创建失败");memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family=AF_INET;serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);serv_adr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)error_handling("bind() error");while(1) {clnt_adr_sz=sizeof(clnt_adr);//利用第33行分配的地址接收数据str_len=recvfrom(serv_sock, message, BUF_SIZE, 0, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);//通过上面的函数调用,获取数据传输端的地址。sendto(serv_sock, message, str_len, 0, (struct sockaddr*)&clnt_adr, clnt_adr_sz);}	close(serv_sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

        接下来就是回声客户端了,这部分代码与TCP客户端不同,不需要用到connect函数。

echo_client:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30
void error_handling(char *message);int main(int argc, char *argv[])
{int sock;char message[BUF_SIZE];int str_len;socklen_t adr_sz;struct sockaddr_in serv_adr, from_adr;if(argc!=3){printf("Usage : %s <IP> <port>\n", argv[0]);exit(1);}//创建UDP套接字sock=socket(PF_INET, SOCK_DGRAM, 0);   if(sock==-1)error_handling("socket() error");memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family=AF_INET;serv_adr.sin_addr.s_addr=inet_addr(argv[1]);serv_adr.sin_port=htons(atoi(argv[2]));while(1){fputs("Insert message(q to quit): ", stdout);fgets(message, sizeof(message), stdin);     if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))	break;//向服务器发送数据sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_adr, sizeof(serv_adr));adr_sz=sizeof(from_adr);//接收服务器发来的数据str_len=recvfrom(sock, message, BUF_SIZE, 0, (struct sockaddr*)&from_adr, &adr_sz);message[str_len]=0;printf("Message from server: %s", message);}	close(sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

运行结果:

Linux环境下用gcc编译 gcc code.cpp -o AppName

对于服务器端启动 ./server 9190

对于客户端启动 ./client 127.0.0.1 9190

Q: TCP客户端套接字在调用connect函数时会自动分配IP地址和端口号,那么UDP的客户端是在何时分配IP和端口号的呢?

A: 对于UDP程序而言,若调用sendto函数时发现尚未分配地址信息,那么在首次调用sendto函数时会给相应的套接字自动分配IP和端口,并且此时分配的地址一直保留到程序结束为止。

故总结来讲,调用sendto函数时会自动分配IP和端口号,因此UDP客户端中通常无需额外的地址分配过程,在sendto函数调用前,IP地址和端口便已在内部自动分配好。

 


http://www.ppmy.cn/news/252868.html

相关文章

2023年浏览器哪个好,如何选择浏览器?

浏览器作为电脑必备的软件之一&#xff0c;相信绝大多数人都用过。选择一款好用的浏览器&#xff0c;可以帮助我们提升工作效率。那么&#xff0c;浏览器哪个比较好&#xff0c;我们如何选择合适的浏览器&#xff1f;为了找到集速度、易用性、安全于一身的浏览器&#xff0c;我…

【SpinalHDL快速入门】5.3、SpinalHDL组织结构之function

文章目录 1.1、简介1.2、RGB to gray1.3、Valid Ready Payload 总线 1.1、简介 使用Scala function 生成硬件的方式与VHDL/Verilog有很大不同&#xff1a; 您可以在其中实例化寄存器、组合逻辑和组件。您不必使用限制信号赋值范围的 process/always 块。一切都是通过引用传递…

SpringCloud-stream一体化MQ解决方案-概念篇

参考资料: 参考demo 参考视频1 参考视频2 官方文档(推荐) 官方文档中文版 关于Kafka和rabbitMQ的安装教程,见本人之前的博客 rocketMq的安装教程

外置光驱DVD-RW错误解决

解决方式&#xff1a; 1&#xff1a;USB供电不足&#xff0c;切换3.0接口&#xff1b; 2&#xff1a;设置区域

html文件怎么用影音先锋打开,先锋影音怎么用

先锋影音怎么用 首先下载影音先锋&#xff0c;你可以在本页面下面下载影音先锋&#xff0c;也可以访问百度首页&#xff0c;在百度搜索“影音先锋”&#xff0c;点击“百度一下”&#xff0c;然后进入影音先锋的官方网站。 点击“影音先锋晕3D版下载”按钮开始下载影音先锋&…

DVD列表

欧美片&#xff1a;杀死比尔1 杀死比尔2 蜘蛛侠1 蜘蛛侠2 花木兰2 华氏911 生化危机2 特洛伊 蝎子王 美丽人生D5 美丽人生 D9 太阳泪 终结者2 MK 赤裸特工 黑客帝国1 花花公子50年纪念 2D9 魔戒1 魔戒2 魔戒3 拯救大兵瑞恩 战栗汪洋 阿甘正传 勇敢的心 ML 勇敢的心 CJ 怒海争锋…

DVD-R和DVD+R有什么区别

要说区别&#xff0c;我想先说说关于DVD碟片的一些历史,让大家了解为什么DVD碟片会有/-之分。 1997年&#xff0c;日本先锋(Pioneer)公司发布了全球第一款DVD刻录机&#xff0c;当时的售价高达35,000美元&#xff0c;想想现在的价格&#xff0c;大家还是很幸福的。该款刻录机使…

xfplay(先锋影音) v8.9.8 官方版

xfplay(先锋影音) v8.9.8 官方版 软件大小&#xff1a;14.9MB软件语言&#xff1a;简体中文软件类别&#xff1a;影音播放软件授权&#xff1a;绿色版更新时间&#xff1a;2015-04-04应用平台&#xff1a;/Win8/Win7/WinXP它是一款支持在线播放视、音频的播放器软件。它资源丰富…