【发布时间】: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”不好。