2013-05-21 4 views
-1

В настоящее время я программирую модуль 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); 
} 
+1

Адрес, где вы вызываете 'accept()'? –

+0

О, моя ошибка. Я звоню в цикл, запущенный в потоке. Я обновлю код. – jetbomber117

+1

Не опробуйте каждые 1 мс! Для чего вы это делаете? Используйте блокирующий сокет или выберите! –

ответ

2

tClientAddrLength Убедитесь инициализируется sizeof sClientAddr перед вызовом accept(). Это обычная ошибка.

Не игнорируйте ошибки. Изучите код ошибки в errno, потому что он сообщает вам, что пошло не так.

1

Вы используете sendto? Это для UDP ... Используйте send.

Кроме того, проверьте, если порт свободен:

telnet localhost 50000 

netstat -a 
Смежные вопросы