免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6009 | 回复: 16
打印 上一主题 下一主题

winsock做socket的server端效率就是低下? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-27 12:19 |只看该作者 |倒序浏览
winsock做server端
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <Winsock2.h>

  6. #pragma comment(lib, "Ws2_32")

  7. #define PORT 12345
  8. #define MAXSOCKFD 10

  9. int main()
  10. {
  11.         WORD wVersionRequested;
  12.         WSADATA wsaData;
  13.         int err;

  14.         wVersionRequested = MAKEWORD( 2, 2 );

  15.         err = WSAStartup( wVersionRequested, &wsaData );
  16.         if ( err != 0 ) {
  17.                 return -1;
  18.         }

  19.         if ( LOBYTE( wsaData.wVersion ) != 2 ||
  20.                         HIBYTE( wsaData.wVersion ) != 2 ) {
  21.                 WSACleanup( );
  22.                 return -1;
  23.         }

  24.         int sockfd;
  25.         if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  26.                 WSACleanup( );
  27.                 return -1;
  28.         }

  29.         struct sockaddr_in addr;
  30.         int addr_len = sizeof(struct sockaddr_in);
  31.         memset(&addr, 0, addr_len);

  32.         addr.sin_family = AF_INET;
  33.         addr.sin_port = htons(PORT);
  34.         addr.sin_addr.s_addr = htonl(INADDR_ANY);

  35.         printf("sockfd: %d\n", sockfd);
  36.         if(bind(sockfd, (sockaddr*)&addr, addr_len) < 0) {
  37.                 WSACleanup( );
  38.                 return -1;
  39.         }

  40.         if(listen(sockfd, MAXSOCKFD) < 0) {
  41.                 WSACleanup( );
  42.                 return -1;
  43.         }
  44.        
  45.         int newsockfd = accept(sockfd, (sockaddr*)&addr, &addr_len);
  46.         printf("newsockfd: %d\n", newsockfd);

  47.         long int sum = 0;
  48.         time_t start; time(&start);
  49.         while(1) {       
  50.                 char buf[1024] = {0};
  51.                 int ret = recv(newsockfd, buf, 1024, 0);
  52.                 if(ret == -1 || ret == 0) break;
  53.                 sum += ret;       
  54.         }
  55.         time_t end; time(&end);

  56.         sum = sum/1024;
  57.         printf("sum: %d\n", sum);

  58.         int sec = end - start;
  59.         printf("time sec: %d\n", sec);

  60.         Sleep(10000000);
  61.                
  62.         return 0;
  63. }
复制代码


linux做socket的client端

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>

  10. #define PORT 12345
  11. #define SERVER_IP "192.168.16.39"

  12. main()
  13. {
  14.         int sockfd;
  15.         if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  16.                 perror("socket");
  17.                 exit(1);
  18.         }

  19.         struct sockaddr_in addr;
  20.         addr.sin_family = AF_INET;
  21.         addr.sin_port = htons(PORT);
  22.         addr.sin_addr.s_addr = inet_addr(SERVER_IP);
  23.        
  24.         if(connect(sockfd, (sockaddr*)&addr, sizeof(addr)) < 0) {
  25.                 perror("connect");
  26.                 exit(1);
  27.         }

  28.         printf("sockfd: %d\n", sockfd);
  29.         for(uint i=0; i<1024*100; i++) {
  30.                 char buf[1024] = {0};
  31.                 send(sockfd, buf, 1024, 0);
  32.         }
  33. }
复制代码



//////////////////////////////////////////////////////////////////////////////////////////////


linux做socket的server端

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <sys/time.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>
  10. #include <pthread.h>

  11. #define PORT 12345
  12. #define MAXSOCKFD 10

  13. int main()
  14. {
  15.         int sockfd;
  16.         if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  17.                 perror("socket");
  18.                 exit(1);
  19.         }

  20.         struct sockaddr_in addr;
  21.         int addr_len = sizeof(struct sockaddr_in);
  22.         memset(&addr, 0, addr_len);

  23.         addr.sin_family = AF_INET;
  24.         addr.sin_port = htons(PORT);
  25.         addr.sin_addr.s_addr = htonl(INADDR_ANY);

  26.         printf("sockfd: %d\n", sockfd);
  27.         if(bind(sockfd, (sockaddr*)&addr, addr_len) < 0) {
  28.                 perror("bind");
  29.                 exit(1);
  30.         }

  31.         if(listen(sockfd, MAXSOCKFD) < 0) {
  32.                 perror("listen");
  33.                 exit(1);
  34.         }
  35.        
  36.         int newsockfd = accept(sockfd, (sockaddr*)&addr, (socklen_t*)&addr_len);
  37.         struct timeval start,end;
  38.         gettimeofday(&start, 0);
  39.         long long int sum = 0;
  40.         while(1) {
  41.                 char buf[1024] = {0};
  42.                 int ret = recv(newsockfd, buf, 1024, 0);
  43.                 if(ret == 0 || ret == -1) break;
  44.                 sum += ret;
  45.         }
  46.         sum = sum/1024;
  47.         printf("sum: %d\n", sum);
  48.         gettimeofday(&end, 0);
  49.         long ltime = (end.tv_sec-start.tv_sec)*1000000+end.tv_usec-start.tv_usec;
  50.         printf("time usec: %d ~= %d\n", ltime, ltime/1000000);

  51.         return 0;
  52. }
复制代码


winsock做socket的client端

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #ifdef WIN32
  4. #include "Winsock2.h"
  5. #else
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #endif

  12. #pragma comment(lib, "Ws2_32")

  13. #define PORT 12345
  14. #define SERVER_IP "127.0.0.1"

  15. int main()
  16. {

  17.         WORD wVersionRequested;
  18.         WSADATA wsaData;
  19.         int err;

  20.         wVersionRequested = MAKEWORD( 2, 2 );

  21.         err = WSAStartup( wVersionRequested, &wsaData );
  22.         if ( err != 0 ) {
  23.                 return -1;
  24.         }

  25.         if ( LOBYTE( wsaData.wVersion ) != 2 ||
  26.                         HIBYTE( wsaData.wVersion ) != 2 ) {
  27.                 WSACleanup( );
  28.                 return -1;
  29.         }


  30.         int sockfd;
  31.         if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  32.                 return -1;
  33.         }

  34.         struct sockaddr_in addr;
  35.         addr.sin_family = AF_INET;
  36.         addr.sin_port = htons(PORT);
  37.         addr.sin_addr.s_addr = inet_addr(SERVER_IP);
  38.        
  39.         if(connect(sockfd, (sockaddr*)&addr, sizeof(addr)) < 0) {
  40.                 return -1;
  41.         }

  42.         printf("sockfd: %d\n", sockfd);
  43.         for(UINT i=0; i<1024*10; i++) {
  44.                 char buf[1024] = {0};
  45.                 send(sockfd, buf, 1024, 0);
  46.         }

  47.         WSACleanup( );



  48.         return 0;
  49. }
复制代码






两台不同的机器,一台windows,一台linux,linux做server端的效率明显要比windows做server端要高,这是我程序的问题?还是windows加了许多自己的东西所导致的?

论坛徽章:
0
2 [报告]
发表于 2008-02-27 12:22 |只看该作者
在我的两台机器上测试出来.linux做server端的传输效率差不多是windows做server端效率的5倍.

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
3 [报告]
发表于 2008-02-27 14:18 |只看该作者
先问你是怎么测试的?
1.linux client=> linux server
2.linux client=> win server
3.win client=> linux server
4.win client=> win server

都测试了? 各什么情况?

论坛徽章:
0
4 [报告]
发表于 2008-02-27 14:36 |只看该作者
原帖由 醉卧水云间 于 2008-2-27 14:18 发表
先问你是怎么测试的?
1.linux client=> linux server
2.linux client=> win server
3.win client=> linux server
4.win client=> win server

都测试了? 各什么情况?



linux server => win client
win server => linux client



linux 做server端.传输了100M,如程序中显示.基本上能达到50M/s(可能网线有问题,一般应该是100M/s左右),千兆传输
反过来win做server端,传输了100M,但是明显差了一打截,只有可怜的10M/s.

论坛徽章:
0
5 [报告]
发表于 2008-02-27 14:37 |只看该作者
是双机直连的

论坛徽章:
0
6 [报告]
发表于 2008-02-27 15:41 |只看该作者
原帖由 yjm0573 于 2008-2-27 14:36 发表



linux server => win client
win server => linux client



linux 做server端.传输了100M,如程序中显示.基本上能达到50M/s(可能网线有问题,一般应该是100M/s左右),千兆传输
反过来win做server端,传 ...


做实验,应该保持对照的一致性。你测试服务端的软件,应使客户端在两个条件下是一样的。要么都用Windows做客户端,要么Linux。

否则你上面那样是不能判断问题是出在客户端还是服务端。

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
7 [报告]
发表于 2008-02-27 15:53 |只看该作者
测试方法不对, 应保持一头不动, 动另一头.

论坛徽章:
0
8 [报告]
发表于 2008-02-27 16:35 |只看该作者
应该没这么大的区别的。

可以将buff 的长度扩大。 再来看区别。

论坛徽章:
0
9 [报告]
发表于 2008-02-27 17:03 |只看该作者
原帖由 doctorjxd 于 2008-2-27 15:41 发表


做实验,应该保持对照的一致性。你测试服务端的软件,应使客户端在两个条件下是一样的。要么都用Windows做客户端,要么Linux。

否则你上面那样是不能判断问题是出在客户端还是服务端。


哦,我可能说得不太明白.是这样的两台电脑,一台win,一台linux.

首先linux做server端, 然后win做client发送了100M数据,然后linux接受数据.我把接受数据需要的时间记录了下来,记为t1.
然后win做server端,然后linux做client同样发送了100M数据,然后win接受数据.我把接受数据需要的时间也记录了下来,记为t2.

结果是t2 远大于 t1.

我再试试 server端发送数据,client端接受数据,看看什么情况.

主要现在可能要在win端做socket的server端,要是真的如现在效率这么差,那就真太令人失望了.

论坛徽章:
0
10 [报告]
发表于 2008-02-27 17:06 |只看该作者
原帖由 benjiam 于 2008-2-27 16:35 发表
应该没这么大的区别的。

可以将buff 的长度扩大。 再来看区别。

那些包装数据包需要的额外的字节比起1024来说,应该是比较小的了.我把他扩大试试.

现在的疑问是我怀疑win的socket自己做了一些杂七杂八的事.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP