Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/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++_Winsock_Listen - Fatal编程技术网

C++ Winsock2:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;“听”;早归

C++ Winsock2:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;“听”;早归,c++,winsock,listen,C++,Winsock,Listen,我是winsock2的新手,我为一台服务器编写了以下代码,我正试图使用该服务器向我在同一台计算机上运行的客户端发送字符串(使用服务器设置为侦听的相同端口连接到127.0.0.1) 我用的是MinGW,如果有关系的话 我遇到的问题是listen()似乎很早就完成了,但返回了成功代码。这是一个问题,因为当调用accept()时,它似乎会永远阻塞。无论我是否在运行客户机程序,都会发生此事件,我在运行前后都尝试过运行客户机程序,但这似乎不会影响它 // -1: "Could not initialize

我是winsock2的新手,我为一台服务器编写了以下代码,我正试图使用该服务器向我在同一台计算机上运行的客户端发送字符串(使用服务器设置为侦听的相同端口连接到127.0.0.1)

我用的是MinGW,如果有关系的话

我遇到的问题是listen()似乎很早就完成了,但返回了成功代码。这是一个问题,因为当调用accept()时,它似乎会永远阻塞。无论我是否在运行客户机程序,都会发生此事件,我在运行前后都尝试过运行客户机程序,但这似乎不会影响它

// -1: "Could not initialize WSA."
// -2: "Could not create listener socket."
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <cstdio>
#define port 0x0ABC
UINT64 trStrLen (char* str)
{
    if (str == NULL) return 0;
    UINT64 pos = 0;
    while (*(str + pos) != '\0') pos++;
    return pos;
};
#include <cstdio>
int main ()
{
    WSADATA wsadata;
    if (WSAStartup(MAKEWORD(2,0),&wsadata)) return -1;
    SOCKET server = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    SOCKADDR_IN sin;
    memset(&sin,0,sizeof(SOCKADDR_IN));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);
    sin.sin_addr.s_addr = INADDR_ANY;
    int socksize = sizeof(SOCKADDR);
    while (bind(server,(SOCKADDR*)(&sin),socksize) == SOCKET_ERROR) return -2;
    char* TEMP_TO_SEND = "Billy Mays does not approve.";
    UINT64 TEMP_SEND_LEN = trStrLen(TEMP_TO_SEND);
    printf("Server online.\n");
    while (true)
    {
        printf("Waiting for connections.\n");
        while (listen(server,SOMAXCONN) == SOCKET_ERROR);
        printf("Client requesting connection.\n");
        SOCKET client = accept(server,NULL,NULL);
        printf("Accept is no longer blocking.\n");
        if (client != INVALID_SOCKET)
        {
            printf("Attempting to send information to the client...\n");
            if (send(client,TEMP_TO_SEND,TEMP_SEND_LEN,0) == SOCKET_ERROR) printf("The information wasn't sent properly.\n");
            else printf("The client received the information.\n");
        }
        else printf("Couldn't establish a connection to the client.\n");
    };
};
/-1:“无法初始化WSA。”
//-2:“无法创建侦听器套接字。”
#定义WIN32_精益_和_平均值
#定义_WIN32_WINNT 0x0501
#包括
#包括
#包括
#包括
#包括
#定义端口0x0ABC
UINT64 trStrLen(字符*str)
{
if(str==NULL)返回0;
UINT64位置=0;
而(*(str+pos)!='\0')pos++;
返回pos;
};
#包括
int main()
{
WSADATA WSADATA;
if(WSAStartup(MAKEWORD(2,0),&wsadata))返回-1;
SOCKET server=SOCKET(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);
SOCKADDR_在罪中;
memset(&sin,0,sizeof(SOCKADDR_IN));
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin\u addr.s\u addr=INADDR\u ANY;
int socksize=sizeof(SOCKADDR);
而(bind(server,(SOCKADDR*)(&sin),socksize)=SOCKET\u ERROR)返回-2;
char*TEMP\u TO\u SEND=“Billy Mays不批准。”;
UINT64临时发送长度=trStrLen(临时发送至发送);
printf(“服务器联机。\n”);
while(true)
{
printf(“正在等待连接。\n”);
while(侦听(服务器,SOMAXCONN)=套接字错误);
printf(“请求连接的客户端。\n”);
套接字客户端=接受(服务器,NULL,NULL);
printf(“接受不再阻塞。\n”);
if(客户端!=无效的\u套接字)
{
printf(“试图向客户端发送信息…\n”);
如果(发送(客户端,临时发送到临时发送,临时发送长度,0)=套接字错误)printf(“信息发送不正确。\n”);
else printf(“客户端收到信息。\n”);
}
else printf(“无法建立到客户端的连接。\n”);
};
};
这可能是显而易见的,但我没有看到,所以任何提示都会有所帮助。

listen()
不是阻塞调用。它对网络没有任何影响。它只是将套接字置于被动侦听模式,设置待办事项队列,然后返回。阻塞调用是
accept()
:它阻塞直到传入连接完成,然后为其返回套接字

所以你根本不应该在
循环中调用
listen()

这同样适用于
bind()
。调用一次。

listen()
不是阻塞调用。它对网络没有任何影响。它只是将套接字置于被动侦听模式,设置待办事项队列,然后返回。阻塞调用是
accept()
:它阻塞直到传入连接完成,然后为其返回套接字

所以你根本不应该在
循环中调用
listen()


这同样适用于
bind()
。请再打一次。

谢谢!我原以为listen会等待连接,这非常有帮助。实际上,我不知道为什么我在这里为
bind()
设置了
循环。在我的实际代码中,它是一个
if
语句。在
时执行
,在这里没有意义。@rsethc:如果您想在调用
accept()
之前等待连接到达,可以使用
select()
。它将告诉您何时有新连接可用,并且它有一个可选的超时参数,如果您在等待时需要执行其他操作,这在循环中非常有用。谢谢!我原以为listen会等待连接,这非常有帮助。实际上,我不知道为什么我在这里为
bind()
设置了
循环。在我的实际代码中,它是一个
if
语句。在
时执行
,在这里没有意义。@rsethc:如果您想在调用
accept()
之前等待连接到达,可以使用
select()
。它将告诉您何时有新连接可用,并且它有一个可选的超时参数,如果您在等待时需要执行其他操作,该参数在循环中非常有用。