Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73633
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 189
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-24 20:56
文章分类

全部博文(21)

文章存档

2016年(1)

2015年(20)

我的朋友

分类: 服务器与存储

2015-09-21 14:46:02

接上一篇(http://blog.chinaunix.net/uid-30430953-id-5201726.html),这段程序同样用来测试使用recvmmsg()与sendmmsg()后的丢包率,只不过这次用pthread_create()创建了4个线程,使用g++  client.c  -o  client  -lpthread编译。由于第一次用pthread_create()函数,不是很熟悉,程序中有不足的地方还望指出
文件一:wrap.h

点击(此处)折叠或打开

  1. #ifndef _WRAP_H_
  2. #define _WRAP_H

  3. #ifndef __USE_GNU
  4. #define __USE_GNU
  5. #endif

  6. #include <sys/socket.h>
  7. #include <sys/types.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10. #include <errno.h>
  11. #include <stdlib.h>
  12. #include <pthread.h>
  13. #include <unistd.h>
  14. #include <netinet/in.h>
  15. #include <arpa/inet.h>
  16. #define DATNUM 100

  17. #endif
文件二:server.c

点击(此处)折叠或打开

  1. /* server.c */
  2. #include "wrap.h"
  3. #define SERV_PORT 8000
  4. #define NUM_THREADS 4            // 创建的线程数

  5. unsigned long b = 0, a = 0; 

  6. void *recv_dat(void *args)       // 线程处理函数
  7. {    
  8.     struct sockaddr_in clitaddr[DATNUM];
  9.     int sockfd, i, n;
  10.     char buf[DATNUM][3];
  11.     struct mmsghdr msgvec[DATNUM];
  12.     struct iovec dataiov[DATNUM];
  13.     struct timespec *timeout;
  14.     timeout = (struct timespec *)malloc(sizeof(struct timespec));

  15.     bzero(clitaddr, sizeof(clitaddr));
  16.     bzero(msgvec, sizeof(msgvec));
  17.     bzero(dataiov, sizeof(dataiov));

  18.     timeout->tv_sec = 5;
  19.     timeout->tv_nsec = 0;
  20.     sockfd = (int)(*((int*)args));
  21.     while(1) {
  22.          for (i = 0; i < DATNUM; i++) {
  23.             dataiov[i].iov_base = buf[i];
  24.             dataiov[i].iov_len = 3;
  25.             msgvec[i].msg_hdr.msg_name = &clitaddr;
  26.             msgvec[i].msg_hdr.msg_namelen = 16;
  27.             msgvec[i].msg_hdr.msg_iov = &dataiov[i];        
  28.             msgvec[i].msg_hdr.msg_iovlen = DATNUM;
  29.          }
  30.          n = recvmmsg(sockfd, msgvec, DATNUM, 0, timeout);
  31.          if (n == -1) {
  32.              b++;
  33.              printf("recv_err_num:%ld\n", b);
  34.          }
  35.         else  {    
  36.              a++;
  37.              printf("recv_num:%ld\n", a);
  38.         }
  39.     }
  40. }

  41. int main(void)
  42. {
  43.     struct sockaddr_in servaddr;
  44.     int sockfd, rc, t;
  45.     pthread_t thread[NUM_THREADS];
  46.  
  47.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  48.     bzero(&servaddr, sizeof(servaddr));
  49.     servaddr.sin_family = AF_INET;
  50.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  51.     servaddr.sin_port = htons(SERV_PORT);
  52.     bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
  53.     printf("Accepting connections ...\n");

  54.     for (t = 0; t < NUM_THREADS; t++) {
  55.         printf("Creating thread %d\n", t);
  56.         rc = pthread_create(&thread[t], NULL, recv_dat, &sockfd);
  57.         if (rc) {
  58.             perror("Error");
  59.             return EXIT_FAILURE;
  60.         }    
  61.     }
  62.     sleep(5);         // 67~70行好像没什么用,因为程序来不到这里
  63.     for(t = 0; t < NUM_THREADS; t++)
  64.         pthread_join(thread[t], NULL);
  65.     return EXIT_SUCCESS;
  66. }
文件三:client.c

点击(此处)折叠或打开

  1. /* client.c */
  2. #include "wrap.h"
  3. #define SERV_PORT 8000

  4. int main(int argc, char *argv[])
  5. {

  6.     struct sockaddr_in servaddr;
  7.     int sockfd, n, i, j, a;
  8.     char m[8] = "FREEDOM";
  9.     struct mmsghdr msgvec[DATNUM];
  10.     struct iovec dataiov[DATNUM];
  11.     socklen_t servaddr_len;

  12.     if (argc != 2) {
  13.        printf("Usage: fileclient \n");
  14.        exit(0);
  15.     }
  16.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  17.     if (sockfd < 0) {
  18.        printf("socket creating fail!\n");
  19.        return 0;
  20.     }
  21.     bzero(&servaddr, sizeof(struct sockaddr_in));
  22.     bzero(msgvec, sizeof(msgvec));
  23.     bzero(dataiov, sizeof(dataiov));
  24.     servaddr.sin_family = AF_INET;
  25.     inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
  26.     servaddr.sin_port = htons(SERV_PORT);

  27.     for (i = 0, a = 0; i < atoi(argv[1]); i++) {
  28.        for(j = 0; j < DATNUM; j++) {                    // for循环里是将数据打包
  29.            bzero(&msgvec[j], sizeof(struct mmsghdr));
  30.            bzero(&dataiov[j], sizeof(struct iovec));
  31.            msgvec[j].msg_hdr.msg_name = &servaddr;
  32.            msgvec[j].msg_hdr.msg_namelen = 16;
  33.            dataiov[j].iov_base = &m;
  34.            dataiov[j].iov_len = 3;
  35.            msgvec[j].msg_hdr.msg_iov = &dataiov[j];
  36.            msgvec[j].msg_hdr.msg_iovlen = DATNUM;
  37.        }
  38.      
  39.        n = sendmmsg(sockfd, msgvec, DATNUM, 0);
  40.        if (n == -1){ 
  41.            printf("sendmmsg error\n");
  42.            exit(0);
  43.        }
  44.        else    a++;

  45.     // usleep(1);
  46.     }
  47.     printf("send_num = %d\n", a);
  48.     return 0;
  49. }







阅读(1806) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~