Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Winsock2';函数的作用是:查找每个端口的连接;即使是那些没有';不存在?_C++_Sockets_Networking_Tcp_Winsock2 - Fatal编程技术网

C++ Winsock2';函数的作用是:查找每个端口的连接;即使是那些没有';不存在?

C++ Winsock2';函数的作用是:查找每个端口的连接;即使是那些没有';不存在?,c++,sockets,networking,tcp,winsock2,C++,Sockets,Networking,Tcp,Winsock2,我正在尝试创建一个方法,该方法使用TCP协议侦听到特定端口的连接请求,除了Windows操作系统附带的库之外,没有其他库。该方法似乎可以很好地创建套接字并绑定到端口;问题似乎出在listen()函数上。即使没有任何端口的连接请求,它也会持续返回零的值,这意味着直接从微软的网站返回- 如果没有发生错误,listen返回零 奇怪的是,所有端口值都会出现这种情况;它似乎找到了一个随机尝试端口的连接请求,范围从1234到8000到-154326。对于每一个,它都返回一个零的值 它应该持续运行,直到找到连

我正在尝试创建一个方法,该方法使用TCP协议侦听到特定端口的连接请求,除了Windows操作系统附带的库之外,没有其他库。该方法似乎可以很好地创建套接字并绑定到端口;问题似乎出在listen()函数上。即使没有任何端口的连接请求,它也会持续返回零的值,这意味着直接从微软的网站返回-

如果没有发生错误,listen返回零

奇怪的是,所有端口值都会出现这种情况;它似乎找到了一个随机尝试端口的连接请求,范围从1234到8000到-154326。对于每一个,它都返回一个零的值

它应该持续运行,直到找到连接请求为止(这显然是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;
}
bool listenport(套接字网络套接字,int端口号){
WSADATA WSADATA;
int error=WSAStartup(0x0202,&wsadata);
如果(错误){

无法您将
listen
accept
混淆
listen
保留应用程序的端口,并对传入连接进行排队。
accept
等待传入连接(如果尚未排队)

当没有传入连接尝试时,
侦听将成功。

listen()将sockfd引用的套接字标记为被动套接字,也就是说,该套接字将用于使用accept(2)接受传入的连接请求

您必须先调用“listen()”,然后才能调用“accept()”;但“accept()”是接受新连接的调用(并为每个新连接提供一个新套接字)

这是“accept()”的手册页:

更好的方法是,查看Beej指南,了解套接字编程的精彩介绍:

附言:


如果您使用的是Windows套接字,请不要忘记调用WSAStartup():)

据我所知,请听()应该等待连接请求,然后给出接受选项,这会创建连接。这是错误的吗?@Simon:这是错误的。
listen
告诉操作系统等待连接请求。它不等待连接。
accept
是等待连接的函数。啊,如果这是真的,那么看起来我用来学习的指南不正确。bit.ly/FQcVbl声称这是真的(如果您有兴趣解释我如何可能错误地解释这一点,请参阅“异步套接字”部分前面的段落)。不,您阅读的指南不正确。指南使用的不是(阻止)“accept()”,而是(一个异步的“WSAAsyncSelect()”,它期望能够处理任意数量的事件。阅读Beej的指南(上面引用)以获得对“sockets”的良好解释。类似于WSAAsyncSelect()的内容是微软的扩展。如果你打算使用微软特定的API,那么请考虑其他类似C·./.NET的替代品。@西蒙BIT.LY/FQCVBL尽管重复了几次,但在这一点上是100%错误的。
是为了,并且提出了一个非常愚蠢的建议,即传递SOMAXCONN,即0x7fffffff,对于积压工作队列来说,这是一个荒谬的大小。他并不知道这是为了什么。+1是为了花时间提供文档链接(尽管“这是accept()的手册页”实际上是链接到connect()