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); }
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); }
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++接入. linux
以上程序上全部Listen都是1000, 按理500个用户同时接入不该该存在被拒绝的状况,由于请求的链接数并没达队列溢出的状况.但测试的结果很明确地说明的问题所在,winsocket下没法同时接入这个量的链接,其实在测试过程250个用户同时接入winsocket就存在拒绝接入的状况,固然服务是不会有影响只是有些链接没法被接入. c++
经过测试能够确认是winsocket的限制,windows则没有由于IIS是能够抵抗这么多用户同时接入的.其实对于普通服务来讲同时200个用户接入已是一个不小的量了,由于持续这个量的处理每秒接入量能够达到1-2W.但感受奇怪的是为何Listen(1000)在winsocket下没有起到做用呢?找了不少资料都没找到具体缘由,若是有熟悉winsocket还有其余参数设置的话但愿能分享一下... windows