TCP/IP 服务器代码在包含附加库后停止工作

Posted

技术标签:

【中文标题】TCP/IP 服务器代码在包含附加库后停止工作【英文标题】:TCP/IP server code stopped working after including additional library 【发布时间】:2020-05-12 07:44:31 【问题描述】:

我是计算机视觉和网络的初学者。 我制作了一个程序来检测和定位小弹珠,它给了我弹珠的 X、Y、Z 位置。 我还制作了一个小型 TCP/IP 服务器应用程序来将此 X、Y、Z 位置发送给机器人。

我现在想将这两个不同的应用程序合并到一个应用程序中。 但是当我尝试将它们结合起来时,tcp/ip 服务器部分停止工作。 在通过导入一些不同的代码行进行一些测试后,每当我尝试包含不同的库(如 OpenCV 或 Librealsense2)时,我看起来都会出错。 有谁知道为什么会发生这种情况以及我该如何解决这个问题?

我在下面包含了服务器代码:

#include <iostream>                 
#include <WS2tcpip.h>           

#pragma comment (lib, "ws2_32.lib")

using namespace std;



int main()


    //initialize winsock (sockets)
    WSADATA wsData;
    WORD ver = MAKEWORD(2, 2);

    int wsOk = WSAStartup(ver, &wsData);
    if (wsOk != 0)
    
        cerr << "Can't initialize winsock! quitting" << endl;
        return 0;
    

    //create a socket
    SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
    if (listening == INVALID_SOCKET)
    
        cerr << "Can't create a socket! quitting" << endl;
        return 2;
    

    //bind the ip to a socket address and port
    sockaddr_in hint;
    hint.sin_family = AF_INET;
    hint.sin_port = htons(1701);
    hint.sin_addr.S_un.S_addr = INADDR_ANY; //could also use inet_pton

    bind(listening, (sockaddr*)&hint, sizeof(hint));

    //tell winsock the socket is for listening
    listen(listening, SOMAXCONN);

    //wait for a connection
    sockaddr_in client;
    int clientSize = sizeof(client);

    SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);
    if (clientSocket == INVALID_SOCKET)
    
        cerr << "Socket not valid! quitting" << endl;
        return 3;
    

    char host[NI_MAXHOST];      //client's remote name
    char service[NI_MAXSERV];   //service (i.e. port) the client is connect on

    ZeroMemory(host, NI_MAXHOST);
    ZeroMemory(service, NI_MAXSERV);

    if (getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0)
    
        cout << host << " connected on port " << service << endl;
    
    else
    
        inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);
        cout << host << " connected on port " <<
            ntohs(client.sin_port) << endl;
    

    //close listening socket
    closesocket(listening);

    char buf[4096];

    while (true) //this part of the code will be used to send and receive data
    
        ZeroMemory(buf, 4096);
        float X = 12.4;
        float Y = 456;
        float Z = 900.87;

        sprintf_s(buf, "(%lf,%lf,%lf)",X,Y,Z);
        size_t buf_len = strlen(buf);

        send(clientSocket, buf, buf_len, 0);




        int bytesReceived = recv(clientSocket, buf, 4096, 0);
    

    //close the socket(s)
    closesocket(clientSocket);

    //shutdown/cleanup winsock (sockets)
    WSACleanup();


当我添加这样的东西时,它会停止工作(返回错误代码 3):

#include <opencv2/opencv.hpp>       //OpenCV library onderdeel
#include <opencv2/core.hpp>         //OpenCV library onderdeel
#include <opencv2/highgui.hpp>      //OpenCV library onderdeel

控制台截图:

【问题讨论】:

停止工作 -- 停止编译或停止运行? "...it stops working (returns error code 3)" 是什么意思?什么返回错误代码 3 以及与该代码相关的错误是什么?您还应该删除using namespace std 它仍然可以编译但它停止运行,我将包含控制台的图像。 我的猜测是,包含 opencv2 文件会引入与套接字 API 冲突的名称,因为您有 using namespace std。见"Why is “using namespace std;” considered bad practice?"。 这确实解决了它看起来的问题。感谢您的提示,我一定会详细了解为什么“使用命名空间 std”不好。 【参考方案1】:

我认为你可以通过做这些事情来改进你的代码并解决问题:

    既然你用的是C++,最好把程序构造成几个类,也就是几个模块,用它们来实现复杂的工作。

    使用using namespace std是不明智的,我们只会在需要的时候使用std库,比如std::cout,因为std库确实很大,有时会和其他第三方库发生冲突。

    您可以尝试像 epoll 或 IOCP 这样的 I/O 多路复用,它们可以极大地提高代码的性能。

【讨论】:

用户 G.M.已经帮我修好了,不过还是谢谢你的回复。

以上是关于TCP/IP 服务器代码在包含附加库后停止工作的主要内容,如果未能解决你的问题,请参考以下文章

导出项目时,omxplayer dbus 控件停止工作

发送消息后客户端停止工作,服务器不等待多个数据到来

本地计算机上的SQL Server(MSSQLSERVER)服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止

TCP/IP详解 卷1 第二十章 TCP的成块数据流

为啥包含 300 张图像的应用程序停止工作?

在`中附加“%” `停止标记