Linux下的通信时延测试程序
今天段老师在网络软件设计课上布置了一个题目。
要求是windows环境,现在在linux环境下实现。
运行C/S模式的2个程序,使用UDP协议,发送10次,计算平均时延。
服务器程序如下:
#include <sys/socket.h> // for functions for socket #include <netinet/in.h> // for struct sockaddr_in #include <stdlib.h> #include <memory.h> // for memset #include <stdio.h> // for perror #include <errno.h> // for errno #define BUFLEN 100 int main(void) { int listenfd; char buf[BUFLEN]; socklen_t len; struct sockaddr_in serv, cli; if ((listenfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { // use udp perror("socket"); exit(EXIT_FAILURE); } memset(&serv, 0, sizeof(serv)); // clear serv.sin_family = AF_INET; // use IPv4 // Listen any ip address and use network // byte order serv.sin_addr.s_addr = htonl(INADDR_ANY); serv.sin_port = htons(9877); // Listen port 9877 if (bind(listenfd, (struct sockaddr*)&serv, sizeof(serv)) < 0) { // bind the socket to the server address perror("bind"); exit(EXIT_FAILURE); } for ( ; ; ) { len = sizeof(cli); if ((recvfrom(listenfd, buf, BUFLEN, 0, (struct sockaddr*)&cli, &len)) < 0) { // recvfrom the listenfd // put the message into buf // no flags (4th argument 0) // save the client address and length if (errno == EINTR || errno == EAGAIN) continue; perror("recvfrom"); exit(EXIT_FAILURE); } if ((sendto(listenfd, "Got it!", 10, 0, (struct sockaddr*)&cli, len)) < 0) { // send the message back // send message "Got it!" back if (errno == EINTR || errno == EAGAIN) continue; perror("sendto"); exit(EXIT_FAILURE); } } return 0; }
客户端程序如下:
#include <sys/socket.h> // for functions for socket #include <arpa/inet.h> // for inet_pton #include <netinet/in.h> // for struct sockaddr_in #include <stdlib.h> #include <memory.h> // for memset #include <stdio.h> // for perror #include <errno.h> // for errno #include <time.h> #define SENDTIMES 10 #define BUFLEN 100 int main(int argc, char* argv[]) { struct sockaddr_in serv; int sockfd; int i; clock_t start, finish; double duration, total = 0; char buf[BUFLEN]; if (argc != 2) { fprintf(stderr, "Usage: ./udpcli <IPADDR>\n"); exit(EXIT_FAILURE); } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { // use udp perror("socket"); exit(EXIT_FAILURE); } memset(&serv, 0, sizeof(serv)); serv.sin_family = AF_INET; serv.sin_port = htons(9877); if ((inet_pton(AF_INET, argv[1], &serv.sin_addr)) == 0) { // read the string to the structrue perror("inet_pton"); exit(EXIT_FAILURE); } again: if ((connect(sockfd, (struct sockaddr*)&serv, sizeof(serv))) < 0) { // this connect is for catch the // error ICMP packets if (errno == EINTR || errno == EAGAIN) goto again; perror("connect"); exit(EXIT_FAILURE); } for (i = 0; i < SENDTIMES; ++i) { printf("Send %d messages.\n", i + 1); start = clock(); again2: if ((sendto(sockfd, "A message!", 20, 0, (struct sockaddr*)&serv, sizeof(serv))) < 0) { if (errno == EINTR) goto again2; perror("sendto"); exit(EXIT_FAILURE); } again3: if ((recvfrom(sockfd, buf, BUFLEN, 0, NULL, NULL)) < 0) { if (errno == EINTR) goto again3; perror("recvfrom"); exit(EXIT_FAILURE); } finish = clock(); duration = finish - start; printf("Spend time: %fms\n", duration); total += duration; } printf("\nAverage time: %fms\n", total / SENDTIMES); return 0; }
运行结果为:
<img src="https://img-blog.csdn.net/20150312120444160?wate%3Ca%20href=" http:="" www.ahlinux.com="" start="" cmd="" 9034.html"="" target="_blank" class="keylink" style="margin: 0px; padding: 3px; border: 1px solid rgb(204, 204, 204); max-width: 660px;">rmark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGRjeHMwMDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="display: block;" />
- 本文来自:Linux教程网
Linux下的通信时延测试程序相关推荐
- linux下TCP通信简单实例
linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- 【流媒体服务器Mediasoup】 NodeJs与C++信令通信详解及Linux下管道通信的详解(五)
目录 前言 匿名管道进程间通信 进程间管道 的创建与图解 MediaSoup中的管道创建 MediaSoup Channel的创建 NodeJs和 C++ 管道通信的过程 MediaSoup 消息确认 ...
- Linux下进程通信知识点学习笔记(一)
4种主要事件导致进程创建: 系统的初始化: 执行了正在运行的进程所调用的进程创建系统调用: 用户请求创建一个进程: 一个批处理作业的初始化: 进程的终止: 正常退出: 出错退: 严重错误: 被其他进程 ...
- linux下串口通信程序,关于Linux下串口通信的一点心得
1. 打开串口 与其他的关于设备编程的方法一样,在 Linux 下,操作.控制串口也是通过操作起设备文件进行的.在 Linux 下,串口的设备文件是 /dev/ttyS0 或 /dev/ttyS1 等 ...
- Linux 下socket通信终极指南(附TCP、UDP完整代码)
linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...
- Linux下Socket通信中非阻塞connect、select、recv 和 recvfrom、send和sendto大致讲解,附带非租塞connect代码、MSG_NOSIGNAL
linux中send函数MSG_NOSIGNAL异常消息 在服务器端用ctrl+c 来结束服务器接收进程来模拟服务器宕机的情况,结束服务 socket 进程之后,服务端自然关闭进程,可是 client ...
- linux下串口通信详解,Linux操作系统下的串口通信学习笔记
http://www.diybl.com/ 2008-7-5 网络 点击: [ 评论 ] - - 文章搜索: [点击打包该文章] [本站开通在线QQ讨论群] CBAUDEX (不属于POSIX ...
- linux通信管道破裂,Linux下进程通信之管道
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把 ...
最新文章
- SKU表管理之更新SKU表数据
- python使用缩进作为语法边界-重庆铜梁高校邦数据科学通识课【Python基础语法】答案...
- 如何让API回调你的VC类成员函数而不是静态函数
- 线性回归与梯度下降法——原理与实现
- Saleor出现 Make sure you've added storefront address to ALLOWED_CLIENT_HOSTS
- 算法积分0042算法笔记——【随机化算法】计算π值和计算定积分
- python验证身份证号码大全_身份证号码处理技巧大全
- Java头文件找出循环依赖_Node.js 如何找出循环依赖的文件?如何解决循环依赖问题?...
- 鸿蒙系统适配机型_余承东:华为手机鸿蒙系统体验比安卓更好,主流应用已完成适配...
- php 3种常见设计模式
- 更新了 pe_xscan 和 ClosePc
- jar类型文件图标不显示_显示的JAR文件
- git里面的文件怎么删不掉_彻底删除git中没用的大文件
- Debian搭建PPTP
- Mean Shift和CamShift算法
- 北京妙计旅行 后台开发实习一面二面
- Android拉起拼多多
- Microsoft SUS Deployment
- CAN详解--CAN与com口介绍
- 医疗软件还能怎么做,才能更进一步。
热门文章
- excel数据平均分配给多人_如何将excel表格中的一列数字平均分配成几组,分组后每组的平均值大致相同...
- win10/win11 + WSL + gui 配置教程
- 【SQL】查询选修了全部课程的学生姓名
- 中乾文化,如何树立正确的财富观?
- 中软国际路线图:先“稳”住大客户,再来谈新增量
- 基于TI AM5728(浮点双DSP C66x +双ARM Cortex-A15)的开发板
- Redis的各种用途以及使用场景
- 用开源博客系统OneBlog来搭建自己的个人技术博客网站(java版博客系统)
- 两个圆柱相交的体积 UVALive 5096 Volume
- 用NetCDF创建和读取NC文件