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("recvfrom");
            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;
}

运行结果为:

时间: 2024-10-31 18:09:45

Linux下的通信时延测试程序的相关文章

linux下串口通信与管理

linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get install setserial 插上USB转串口,在终端输入命令 #dmesg | grep ttyUSB0 如果出现连接成功信息,则说明系统已经识别该设备 一.找到自己的串口设备 查找自己的开发板与电脑的连接的COM口方法 Windows:设备管理器 linux: (1)dmesg #查看带有

Linux下串口通信工具minicom

minicom是linux下的串口通信工具,类似于Windows下的超级终端. 一般在yum源中可以直接安装 minicom -s可以设置minicom的速率,流控之类. 如上图:A是你的设备名.如在台式机上用console接串口则一般为/dev/ttyS0, 如果笔记本上使用USB-串口转换则为/dev/ttyUSB0之类. Linux下一般均默认安装了USB-串口的驱动 将配置保存为默认(Save setup as dfl),下次输入minicom则可以启动 注意:非正常关闭minicom,

Linux下进程通信之管道

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication).如下图所示. 目前进程通信的方式有: 管道 FIFO 消息队列 信号量 共享内存 套接字 管道 管道概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数

Linux 下管道通信

管道和消息队列本质都差不多,都是linux内核的缓冲区. 管道限制管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信:通常,一个管道由一个进程创建,然后该进程调用fork,此后父.子进程之间就可应用该管道.管道用的是越来越少了 管道读写规 当没有数据可读时 read调用阻塞,即进程暂停执行,一直等到有数据来到为止. 如果设置了不等待,read调用返回-1,errno值为EAGAIN. 当管道满的时候 write调

linux下IPC通信

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. # 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段. # 消息队列

Linux下串口通信工具minicom的用法

一.查看串口设备 例如,将USB转串口线插入交换机Console口后,执行命令:$ll /dev/ttyUSB* 二.连接串口设备 $sudo minicom -D /dev/ttyUSB0 三.设置串口参数 在minicom中按CTRL+A,O,配置串口速率9600,8位,无奇偶校验,保存 四.查看minicom配置文件 [email protected]:~$ cat .minirc# Machine-generated file - use setup menu in minicom to

linux 下4G通信相关

http://wiki.friendlyarm.com/wiki/index.php/How_to_use_4G_Module_on_NanoPC-T4/zh http://download.icxbk.com/201807/765370b9d4f571fffcbc9cc1ab6a336a.pdf 原文地址:https://www.cnblogs.com/cute/p/11270248.html

Linux下进程间Socket通信调试debug方法

在一个复杂的软件系统中,往往需要有各个组件之间的数据传递,在组件间数据传递过程中,又会不可避免的出现一些小问题,这时候我们就需要来进行debug了,由于最近的一个系统使用到了collectd和rrdcached来收集数据和画图,它们之间采用了Unix socket通信,因此小小的学习了一下相关知识. 首先我们来回忆下Linux下进程通信有哪些方法: 管道(Pipe)及有名管道(FIFO)\UNIX BSD 信号(Signal) \UNIX BSD 报文消息队列(Message)\UNIX sys

linux下minicom和USB转串口

minicom是linux下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有"超级终端"那么易用,但是使用习惯之后读者将会体会到它的高效与便利,下面将讲解minicom的安装和配置. 一.安装minicom: 使用以下命令:# sudo apt-get install minicom ubuntu 现在做的真是没话说,相当的实用和智能啊,把相关的依赖包(lrzsz)都相互关联并且安装上去了.但是如果使用ubuntu  8.10以前的版本可能就要单独安装lrzsz软件包了(lrzsz