Linux下的通信时延测试程序

来源:互联网 发布:cp雾化器二代做芯数据 编辑:程序博客网 时间:2024/05/01 15:29

今天段老师在网络软件设计课上布置了一个题目。

要求是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 100int 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 100int 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="http://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教程网
0 0