【发布时间】:2015-09-15 20:17:21
【问题描述】:
下面的代码不会阻塞在listen() 上,它只是完成了执行。你能告诉我为什么吗? (initWSA 返回 true,我检查了它)。我正在学习一个教程,但有人告诉我它应该阻止,因为它正在寻找连接的客户端。
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define PORT 10000
bool initWSA(){
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
if (error) return false;
if (wsadata.wVersion != 0x0202){
WSACleanup();
return false;
}
return true;
}
void closeConnection(SOCKET s)
{
//Close the socket if it exists
if (s)
closesocket(s);
WSACleanup(); //Clean up Winsock
}
int main(){
initWSA();
SOCKET s;
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET) cout << "INVALID SOCKET" << endl;
if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR){
cout << "SOCKET ERROR" << endl;
}
listen(s, SOMAXCONN);
//cout << "CAUGHT ONE" << endl;
//closeConnection(s);
return 0;
}
【问题讨论】:
-
listen() 是非阻塞的。 accept() 阻塞并在连接时返回一个客户端服务器套接字。
-
那听什么?
-
Err.. man listen, or Google 'listen()'
-
那么我应该先调用listen然后在它之后接受吗?编辑:是的,它有效,谢谢,你可以发布答案:)
-
listen()告诉操作系统开始将connect()的潜在客户端排队到您的服务器(并提示允许多少挂起的连接)...accept()实际上使对等方对等连接。你确实应该accept()。
标签: c++ sockets connection server winsock