Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++ 为什么包含“boost/multiprecision/cpp_int.hpp”会破坏套接字?_C++_Boost_Winsock2 - Fatal编程技术网

C++ 为什么包含“boost/multiprecision/cpp_int.hpp”会破坏套接字?

C++ 为什么包含“boost/multiprecision/cpp_int.hpp”会破坏套接字?,c++,boost,winsock2,C++,Boost,Winsock2,我有一个服务器应用程序的工作代码。 现在我需要在我的项目中使用cpp_int。 但是,当我尝试包含boost/multiprecision/cpp_int.hpp时 AcceptListingSocket、sockaddr*&客户端和SizeOffClient 返回无效的_套接字,程序以代码3终止 这是server.cpp的代码 #include <iostream> #include <Ws2tcpip.h> //#include <boost/multiprec

我有一个服务器应用程序的工作代码。 现在我需要在我的项目中使用cpp_int。 但是,当我尝试包含boost/multiprecision/cpp_int.hpp时

AcceptListingSocket、sockaddr*&客户端和SizeOffClient

返回无效的_套接字,程序以代码3终止

这是server.cpp的代码

#include <iostream>
#include <Ws2tcpip.h>
//#include <boost/multiprecision/cpp_int.hpp> // reason of the probmlem
#pragma comment(lib, "ws2_32.lib")
constexpr auto MSIZE = 4096;
using namespace std;

int main()
{
    WSADATA wsData;
    WORD ver = MAKEWORD(2, 2);
    if (WSAStartup(ver, &wsData) != 0)
    {
        cerr << "Can't initialise winsock\nQuiting...\n";
        return 1;
    }   
    SOCKET listeningSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (listeningSocket == INVALID_SOCKET)
    {
        cerr << "Can't create a socket!\nQuiting...\n";
        return 2;
    }
    sockaddr_in hint;
    hint.sin_family = AF_INET;
    hint.sin_port = htons(54000);
    hint.sin_addr.S_un.S_addr = INADDR_ANY;
    bind(listeningSocket, (sockaddr*)&hint, sizeof(hint));
    listen(listeningSocket, SOMAXCONN);
    cout << "Listenning\n";
    sockaddr_in client;
    int sizeofclient = sizeof(client);
    SOCKET clientSocket = accept(listeningSocket, (sockaddr*)&client, &sizeofclient);
    if (clientSocket == INVALID_SOCKET)
    {
        cerr << "Invalid socket.\nQuiting...\n";
        return 3;
    }

    char host[NI_MAXHOST];
    char service[NI_MAXHOST];
    ZeroMemory(host, NI_MAXHOST);
    ZeroMemory(service, NI_MAXHOST);
    char buf[MSIZE];
    while (1)
    {
        ZeroMemory(buf, MSIZE);
        int bytesReceived = recv(clientSocket, buf, MSIZE, 0);
        if (bytesReceived == SOCKET_ERROR)
        {
            cerr << "Error in recv()\n";
            break;
        }
        if (bytesReceived == 0)
        {
            cout << "Client disconnected" << endl;
            break;
        }
        if (strcmp("\r\n", buf) != 0)
        {
            cout << "(Request from " << host << ") >>  " << buf << endl;
            if (strcmp(buf, "hello") == 0)
            {
                char response[100] = "Greetings!\n\r";
                send(clientSocket, response, sizeof(response) + 1, 0);
            }
            else 
            {
                char response[100] = "Invalid command!\n\r";
                send(clientSocket, response, sizeof(response) + 1, 0);
            }
        }
    }
    cout << "Quiting program\n";
    return 0;
}

有什么想法吗?

问题是您使用namespace std;的副作用

当您包含时,它从C++的头中拉入,这是您的代码最终调用的函数,而不是Winsock的bind函数。因此,侦听和接受失败,因为服务器套接字未绑定到网络接口,并且您的代码未检查绑定和侦听的错误。如果您检查了listen和accept的错误代码,就会发现它们都报告了WSAEINVAL,这意味着套接字没有绑定到bind,并且在accept之前没有调用listen函数

你要么

,然后在需要时显式使用std::prefix这是首选解决方案

当调用Bin时,可以用::要告诉编译器,您想从全局命名空间Win32 API调用绑定函数,像Winsock一样,不要在C++中使用命名空间,而不要从STD命名空间中使用命名空间。p>


问题是使用namespace std;的副作用

当您包含时,它从C++的头中拉入,这是您的代码最终调用的函数,而不是Winsock的bind函数。因此,侦听和接受失败,因为服务器套接字未绑定到网络接口,并且您的代码未检查绑定和侦听的错误。如果您检查了listen和accept的错误代码,就会发现它们都报告了WSAEINVAL,这意味着套接字没有绑定到bind,并且在accept之前没有调用listen函数

你要么

,然后在需要时显式使用std::prefix这是首选解决方案

当调用Bin时,可以用::要告诉编译器,您想从全局命名空间Win32 API调用绑定函数,像Winsock一样,不要在C++中使用命名空间,而不要从STD命名空间中使用命名空间。p>


可能您应该在发生错误时打印errno的值,或者使用perror或strerror。是否将bind更改为::bind help?@Bodo尝试过。perror没有显示任何错误,也没有使用名称空间std消除错误;并在需要时显式添加std::是的!谢谢!::bind WORKS当发生错误时,您可能应该打印errno的值,或者使用perror或strerror。是否将bind更改为::bind help?@Bodo尝试过。perror没有显示任何错误,也没有使用名称空间std消除错误;并在需要时显式添加std::是的!谢谢!::装订厂