博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinSocket同时接入量的疑惑(求解...)
阅读量:7058 次
发布时间:2019-06-28

本文共 2133 字,大约阅读时间需要 7 分钟。

        在写TCP应用的时候一般都通过Accept来接入连接的接入,但对于Socket来说这个Accept同时能处理多大的量一般都没有明确说明,在应用中主要根据自己的需要设置Listen的队列数量.那Listen(1000)是不是就能说明同时刻1000个连接进来都能被Accept到呢?通过测试的结果来看windows下是不能的....Linux下则可以.

测试代码

  • C#
    Socket mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);           mSocket.Bind(new IPEndPoint(IPAddress.Any,80));           mSocket.Listen(1000);           int i = 0;           while (true)           {               Socket http= mSocket.Accept();               System.Threading.Thread.Sleep(200);               i++;               Console.WriteLine("Accept:{0} ", i);                          }
  • win C++
    iResult = listen(ListenSocket, 1000);	if (iResult == SOCKET_ERROR) {		printf("listen failed with error: %d\n", WSAGetLastError());		closesocket(ListenSocket);		WSACleanup();		return 1;	}	int i=0;	while(true)	{		// Accept a client socket		ClientSocket = accept(ListenSocket, NULL, NULL);		i++;		if (ClientSocket == INVALID_SOCKET) {			printf("accept failed with error: %d\n", WSAGetLastError());			closesocket(ListenSocket);			WSACleanup();			return 1;		}		iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);		printf("accept: %d\n", i);	 	}
  • linux c++
    if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)	{		perror("bind");		return 1;	}	listen(server_sockfd,1000);	sin_size=sizeof(struct sockaddr_in);	int i=0;    while(1)    {        i++;        if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)        {            cout<<"accept error";            return 1;        }         len=recv(client_sockfd,buf,BUFSIZ,0);        cout << "Accept:" << i<<"Receive:"<

        通过AB开启500个用户压相应的程序,C#,WIN C++都会导致AB出现apr_socket_recv: Connection refused (111).但Linux c++这代码是完全正常,AB所有请求的连接都通过被Linux c++接入.

        以上程序上所有Listen都是1000, 按理500个用户同时接入不应该存在被拒绝的情况,因为请求的连接数并没达队列溢出的情况.但测试的结果很明确地说明的问题所在,winsocket下无法同时接入这个量的连接,其实在测试过程250个用户同时接入winsocket就存在拒绝接入的情况,当然服务是不会有影响只是有些连接无法被接入.

总结

        通过测试可以确认是winsocket的限制,windows则没有因为IIS是可以抵抗这么多用户同时接入的.其实对于普通服务来说同时200个用户接入已经是一个不小的量了,因为持续这个量的处理每秒接入量可以达到1-2W.但感觉奇怪的是为什么Listen(1000)在winsocket下没有起到作用呢?找了很多资料都没找到具体原因,如果有熟悉winsocket还有其他参数设置的话希望能分享一下...

 

转载地址:http://sugol.baihongyu.com/

你可能感兴趣的文章
Android View 之进度条+拖动条+星级评论条....
查看>>
Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本
查看>>
Android解析JSON速度对比
查看>>
javascipt继承机制(from阮一峰)
查看>>
Atitit.http连接合并组件 ConnReducerV3 新特性
查看>>
Android USB Gadget复合设备驱动(打印机)测试方法
查看>>
Windows 7下配置JDK环境变量和Java环境变量配置
查看>>
linux 修改 elf 文件的dynamic linker 和 rpath
查看>>
WPF模糊效果(BlurEffect)
查看>>
tomcat主目录
查看>>
基础学习笔记之opencv(21):一个简单有趣的皮肤检测代码
查看>>
重读《Agile Retrospective敏捷回顾》一书
查看>>
uva 10160 Servicing Stations(DFS+剪枝)
查看>>
【转】单链表判断是否有交点,是否有环
查看>>
Eclipse发布安卓APK包无图标的解决方法
查看>>
DataTable转换为List<T>或者DataRow转换为T
查看>>
sqlite数据库执行full outer join
查看>>
多线程编程学习笔记——任务并行库(三)
查看>>
Java微信公众平台开发(六)--微信开发中的token获取
查看>>
poj 1523 SPF(tarjan求割点)
查看>>