У меня проблема с моим кодом. Я использую C ++. Я использую сокет Openssl и выбираю многопоточную программу select ()
Если я соединяю три одновременно, один может не подключиться. один клиент возвращает -1 при Connect()
коде. Иногда все три работают хорошо.
Все источники не могут быть опубликованы, поэтому я кратко опубликую их. Я был бы признателен, если бы вы могли подтвердить любые проблемы с процессом.
мой код клиента здесь. я использую многопоточную программу для подключения к серверу.
int createSocket(itld_va_ctx_t *ctx, char* host, int port)
{
int client_desc;
struct hostent* hp;
unsigned long addr;
struct sockaddr_in server;
client_desc = socket(AF_INET, SOCK_STREAM, 0);
if(client_desc == -1) {
ctx->recog->error_code = E_SOCK;
ctx->recog->error_code_detail = errno;
LOG("Error - couldn't create socket !\n");
return FALSE;
}
addr = inet_addr(host);
if (addr == INADDR_NONE) {
hp = gethostbyname(host);
if (hp == NULL) {
close(client_desc);
return FALSE;
}
addr = *((unsigned long*) hp->h_addr);
}
server.sin_addr.s_addr = addr;
server.sin_family = AF_INET;
server.sin_port = htons(port);
if ( -1 == connect(client_desc, (struct sockaddr*) &server, sizeof(server))) {
ctx->recog->error_code = E_CONN;
ctx->recog->error_code_detail = errno;
printf(">>>>>>error:::%d: %s\n",errno,strerror(errno));
LOG("ERROR: couldn't connect to server!\n");
close(client_desc);
return FALSE;
}
return client_desc;
}
мой код сервера находится здесь. Я звоню Listen()
и AcceptClient()
bool Listen(int32 port) {
h_addr_.sin_addr.s_addr = INADDR_ANY;
h_addr_.sin_port = htons(port);
h_addr_.sin_family = AF_INET;
server_desc_ = socket(AF_INET, SOCK_STREAM, 0);
maxDs = server_desc_;
if (server_desc_ == -1) {
return false;
}
int32 flag = 1;
int32 len = sizeof(int32);
if( setsockopt(server_desc_, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1){
return false;
}
if (bind(server_desc_, (struct sockaddr*) &h_addr_, sizeof(h_addr_)) == -1) {
return false;
}
if (listen(server_desc_, 1) == -1) {
return false;
}
FD_ZERO(&fsStatus);
FD_SET(server_desc_, &fsStatus);
std::cout << "TcpServer: Listening on port: " << port << std::endl;
return true;
}
int32 AcceptClient(bool* client_soc, int32 size) {
socklen_t len;
int32 nselect;
struct timeval tv;
fd_set temp = fsStatus;
do{
for(int32 i=0; i < size; i++) {
if(client_soc[i] == true){
FD_SET(i, &temp);
}
}
nselect = select(maxDs + 1, &temp, NULL, NULL, NULL);
KALDI_LOG << "Select :" << nselect ;
if(nselect == 0) {
close(server_desc_);
return -1;
} else if(nselect < 0) {
if(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {
//continue;
return nselect;
}else {
return nselect;
}
} else {
if(!FD_ISSET(server_desc_, &fsStatus)){
return -1;
} else {
break;
}
}
} while(0);
len = sizeof(struct sockaddr);
client_desc = accept(server_desc_, (struct sockaddr*) &h_addr_, &len);
if(client_desc < 0){
return -1;
}
if(client_desc > maxDs)
{
maxDs = client_desc + 1;
}
if(client_desc > 0)
{
tv.tv_sec = 10;
tv.tv_usec = 0;
if( setsockopt(client_desc, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) == -1)
{
close(client_desc);
return -1;
}
if( setsockopt(client_desc, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof( struct timeval)) == -1 )
{
close(client_desc);
return -1;
}
int32 flag = 1;
int32 len = sizeof(int32);
if( setsockopt(client_desc, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)
{
close(client_desc);
return -1;
}
}
return client_desc;
}