• WinSocket同时接入量的疑惑(求解...)


            在写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
      ", 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
      ", WSAGetLastError());
      			closesocket(ListenSocket);
      			WSACleanup();
      			return 1;
      		}
      		iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
      		printf("accept: %d
      ", 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:"<<len;
      
          }

            通过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还有其他参数设置的话希望能分享一下...

     

  • 相关阅读:
    spring-boot-swagger2 使用手册
    mall整合Swagger-UI实现在线API文档
    MyBatis Generator 详解
    1046 划拳 (15分)
    1043 输出PATest (20分)
    1042 字符统计 (20分)
    1041 考试座位号 (15分)
    1040 有几个PAT (25分)
    1039 到底买不买 (20分)
    1038 统计同成绩学生 (20分)
  • 原文地址:https://www.cnblogs.com/smark/p/3487102.html
Copyright © 2020-2023  润新知