В настоящее время я программирую модуль C++, который создает поток сервера сокетов, который проверяет функцию accept() каждые 1 мс. У меня есть тестовый модуль, который обманывает клиентское соединение, которое также работает. Модуль тестирования инициирует создание серверного потока. После того, как поток создан и проверен для запуска, клиент запускает команду connect() в качестве теста. В моем коде указано, что соединение установлено, возвращая 0 в команде connect. Однако accept(), выполняющийся в моем потоке сервера, никогда не получает соединение.Подключение к Socket Socket автоматически устанавливается?
Сервер обязан принимать любые IP: 50000, а клиент не связан, но в качестве адресата указан 127.0.0.1:50000. Является ли моя Linux-среда автоматически принимающей это соединение?
Вот код для сокета моего сервера:
int nSocket;
int nOn = 1;
int nControl;
struct sockaddr_in sServerAddress;
nSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(nSocket < 0)
{
std::cout << "Failed to create socket\n";
}
if(setsockopt(nSocket, SOL_SOCKET, SO_REUSEADDR, &nOn, sizeof(int)) < 0)
{
std::cout << "failed to set socket option\n";
}
nControl = fcntl(nSocket, F_GETFL);
if(fcntl(nSocket, F_SETFL, O_NONBLOCK | nControl) < 0)
{
std::cout << "set not blocking failed\n";
}
memset(&sServerAddress, 0x00, sizeof(struct sockaddr_in));
sServerAddress.sin_family = AF_INET;
sServerAddress.sin_addr.s_addr = htonl(INADDR_ANY);
sServerAddress.sin_port = htons(mtListenPort);
if(bind(nSocket, (struct sockaddr*)&sServerAddress, sizeof(struct sockaddr_in)) < 0)
{
std::cout << errno << "bind failed\n";
}
if(listen(nSocket, MAXPENDING) < 0)
{
std::cout << "listen failed\n";
}
Вот код для сокета моего тестового клиента:
int nSocket;
nSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(nSocket < 0)
{
std::cout << "Failed to create socket\n";
}
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
inet_aton(LOCAL_HOST, &serverAddress.sin_addr);
serverAddress.sin_port = htons(LISTEN_PORT00);
char msg[] = "Hello World.";
usleep(10000);
if (connect(nSocket, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0)
{
std::cout << errno << "Could not connect to the server.\n";
}
usleep(10000);
if (sendto(nSocket, msg, strlen(msg), 0, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0)
{
std::cout << errno << "Could not send data to the server.\n";
}
Вот небольшая часть потока, который запускает принять код ,
while(mbListening)
{
nMessengerSocket = accept(mnSocket, (struct sockaddr*)&sClientAddr, &tClientAddrLength);
if(nMessengerSocket >= 0)
{
std::cout << "Accepted connection from " << inet_ntoa(sClientAddr.sin_addr) << std::endl;
mnConnections++;
mbListening = false;
}
mThreadRunningTime++;
usleep(1000);
}
Адрес, где вы вызываете 'accept()'? –
О, моя ошибка. Я звоню в цикл, запущенный в потоке. Я обновлю код. – jetbomber117
Не опробуйте каждые 1 мс! Для чего вы это делаете? Используйте блокирующий сокет или выберите! –