Ошибка открытия сокета TCP-сервера при переполнении стека

В настоящее время я создаю программу, где мне требуется TCP-сервер для связи с приложением Android. Я написал и протестировал TCP-сервер как отдельный проект, и он работает совершенно нормально. При включении этого в более крупный проект, где у меня есть другие процессы, он больше не открывает сокет для прослушивания.

Мой проект создается в Visual Studio 2017, и я использую следующие библиотеки:

  • WS2_32.lib для TCP
  • OpenCV для обработки изображений
  • Libcurl для отправки файлов в базу данных
  • ACTi SDK для извлечения изображения из камеры

Код сервера TCP, который я написал (взят из https://www.youtube.com/watch?v=WDn-htpBlnU&т = 162s):

void TCPServer()
{
//Initalize winsock
WSADATA wsData;
WORD ver = MAKEWORD(2, 2);

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

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

//Bind the socket to an ip address and port
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(100);
hint.sin_addr.S_un.S_addr = INADDR_ANY; //Could 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);

char host[NI_MAXHOST];  //Clients remote name
char service[NI_MAXHOST];   //Service the client is on

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

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);

//While loop:accept and echo message back to client
char buf[4096];

while (true)
{
ZeroMemory(buf, 4096);

//Wait for client to send data
int bytesReceived = recv(clientsocket, buf, 4096, 0);
if (bytesReceived == SOCKET_ERROR)
{
cerr << "Error in recv()" << endl;
break;
}

if (bytesReceived == 0)
{
cout << "Client disconnected" << endl;
break;
}

cout << buf << endl;
}

//Close the socket
closesocket(clientsocket);

//cleanup windsock
WSACleanup();
}

Как я уже сказал, этот код работает как отдельный проект, однако, когда я включаю его в свой общий проект, сокет не открывается, и соединение с 204.204.204.204 устанавливается мгновенно. Это было проверено в обеих ситуациях путем просмотра всех открытых сокетов с помощью netstat. Я чувствую, что это может быть конфликт библиотеки, возможно, между WS2_32 и libcurl, однако я не уверен.

Я сейчас проверяю это по телефону TCPServer() в основном, однако, я планирую запустить сервер с несколькими другими процессами.

Будем весьма благодарны за любые предложения относительно того, почему сокет не открывается.

2

Решение

После проверки работоспособности удалось сузить до bind(...) функция. Кажется, ошибка заключается в том, чтобы using namespace std;

Решением было вызвать bind из глобального пространства имен, выполнив ::bind(...), Это решение было найдено здесь: Ошибки компиляции с функцией связывания сокета

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru