Winsock2 的 listen() 函数为每个端口查找一个连接;甚至那些不存在的?
Winsock2's listen() function finds a connection for every port; even those that don't exist?
我正在尝试创建一个方法,该方法使用TCP协议侦听到特定端口的连接请求,除了Windows操作系统自带的库之外没有其他库。该方法似乎可以很好地创建套接字并绑定到端口;问题似乎出在listen()函数上。即使没有任何端口的连接请求,它也会不断返回0的值,这意味着,直接从微软的网站——
如果没有错误发生,listen返回0。
奇怪的是,所有的端口值都会发生这种情况;它似乎找到了一个随机尝试端口的连接请求,范围从1234,到8000,到-154326。对于每一个,它都返回一个0的值。
它应该做的是持续运行直到找到连接请求(这显然是SOMAXCONN所指示的);再一次,直接从微软的网站-
如果没有可用的套接字描述符,listen尝试继续运行。
这是方法本身-
bool listenOnPort(SOCKET networkSocket, int portNumber) {
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
if(error) {
cout << "Failed to start up Windows Sockets API." << endl;
return false;
}
if(wsadata.wVersion != 0x0202) {
WSACleanup();
cout << "Failed to find a valid Windows Sockets API." << endl;
return false;
}
SOCKADDR_IN address;
address.sin_family = AF_INET;
address.sin_port = htons(portNumber);
address.sin_addr.s_addr = htonl(INADDR_ANY);
networkSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(networkSocket == INVALID_SOCKET) {
cout << "Failed to create a network socket." << endl;
return false;
}
if(bind(networkSocket, (LPSOCKADDR)&address, sizeof(address)) == SOCKET_ERROR) {
cout << "Failed to bind to the port." << endl;
return false;
}
cout << "Listening for a connection to port " << portNumber <<"..." << endl;
listen(networkSocket, SOMAXCONN);
cout << "Found a connection!" << endl;
}
任何解释/建议都是感激的-提前感谢你!
你把listen
和accept
混淆了。listen
为您的应用程序保留端口,并将传入的连接排队。accept
等待一个传入的连接(如果一个还没有排队)。
listen
将在没有传入连接尝试时成功。
http://linux.die.net/man/2/listen
listen()将sockfd引用的套接字标记为被动套接字,也就是说,作为一个将用于使用accept(2)接受传入连接请求的套接字。
必须在调用accept()之前调用listen();但是"accept()"是接受新连接的调用(并为每个新连接提供一个新的套接字)。
accept()的手册页":
http://linux.die.net/man/2/accept更好,看Beej's Guide关于socket编程的优秀介绍:
http://beej.us/guide/bgnet/output/html/multipage/PS:不要忘记调用WSAStartup()如果你使用的是Windows套接字:)
相关文章:
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- g++ 说函数不存在,即使包含正确的标头
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 查找第一个数组中不存在的元素
- 查找不存在的键时,unordered_map返回什么
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- set::find 查找不存在的元素
- 有没有办法将字符串添加到 Vector 中,但前提是它尚不存在?->C++
- inet_ntop返回不存在的地址
- CPP 使用不存在的键访问映射
- 为什么QMediaGaplessPlaybackControl不存在?
- QObject::连接不起作用 - 使用函数语法找不到信号
- 如果键不存在,使用 [] 运算符访问 STL Map 元素会添加新元素
- C++/Qt项目中的连接功能中不存在插槽?(已经重新运行了制作)
- C++ - 程序在尝试在 TCP 客户端上连接到不存在的地址时表现出奇怪的行为
- 套接字连接到不存在的ip地址上的端口
- Winsock2 的 listen() 函数为每个端口查找一个连接;甚至那些不存在的?
- WINSOCK-在不存在的IP上设置连接尝试超时