В настоящее время я создаю программу, где мне требуется TCP-сервер для связи с приложением Android. Я написал и протестировал TCP-сервер как отдельный проект, и он работает совершенно нормально. При включении этого в более крупный проект, где у меня есть другие процессы, он больше не открывает сокет для прослушивания.
Мой проект создается в Visual Studio 2017, и я использую следующие библиотеки:
Код сервера 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()
в основном, однако, я планирую запустить сервер с несколькими другими процессами.
Будем весьма благодарны за любые предложения относительно того, почему сокет не открывается.
После проверки работоспособности удалось сузить до bind(...)
функция. Кажется, ошибка заключается в том, чтобы using namespace std;
Решением было вызвать bind из глобального пространства имен, выполнив ::bind(...)
, Это решение было найдено здесь: Ошибки компиляции с функцией связывания сокета
Других решений пока нет …