TCP-сервер принимает вызов не возвращает - PullRequest
0 голосов
/ 01 апреля 2011

Нам нужна помощь с кодом клиентского сервера TCP. Время ожидания клиента от его соединения и сервер не возвращается от принятия. Вот эта полоска.

strace -p 7167 -p 7168 -p 7297
Process 7167 attached - interrupt to quit
Process 7168 attached - interrupt to quit
Process 7297 attached - interrupt to quit
[pid  7167] accept(4,  <unfinished ...>
[pid  7168] accept(4,  <unfinished ...>
[pid  7297] connect(3, {sa_family=AF_INET, sin_port=htons(24465), sin_addr=inet_addr("215.47.142.168")}, 16

Мы перезагрузили систему, но проблема сохраняется даже сразу после перезагрузки.

Может ли это быть проблемой SYN Flood. Как мы имеем дело с такими связями? Кроме того, наполовину выполненные соединения ставятся в очередь в очереди прослушивания (аргумент 2 вызова прослушивания) и прекращают дальнейшие приемы от любого клиента, ИЛИ делает ли TCP то, как блокирует только этот конкретный клиент.

Вот код ... client.all это внутри функции, которая возвращает сокет

int sock = socket(nmspace,style,protocol);                         
int ret;
struct hostent *hinfo;                                             
if(sock<0){
    printf("Error occurred while creating socket:%d\n",sock);
    printf("%s\n",strerror(errno));
    return -1;
}
memset(&dest, 0, sizeof(struct sockaddr_in));                      
hinfo = gethostbyname(rmserver);
if(hinfo == NULL)
    printf("getbyname failed!\n");
dest.sin_family = AF_INET;                                          
dest.sin_addr =  *(struct in_addr *)(hinfo->h_addr);               
dest.sin_port = htons(port);                                        
ret = connect(sock, (struct sockaddr *)&dest, sizeof(struct sockaddr)); 
if(ret<0){
    printf("Error occurred while connecting on the socket:%d\n",sock);
    printf("%s\n",strerror(errno));
    close(sock);
    return -1;
}

Сервер создание сокета сервера ... все это внутри функции, которая возвращает сокет >>>>>>

struct sockaddr_in serv;    
int mysocket,r;
mysocket = socket(AF_INET, SOCK_STREAM, 0);   
memset(&serv, 0, sizeof(struct sockaddr_in)); 
serv.sin_family = AF_INET;                    
serv.sin_addr.s_addr = INADDR_ANY;            
serv.sin_port = htons(port);                  
r = bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr)); 
if(r<0) {
    printf("Error occurred binding the socket:%d to the server port:%d\n",mysocket,port);
    printf("%s",strerror(errno));
    close(mysocket);
    return -1;
}
r = listen(mysocket, 5);               
if(r<0) {
    printf("Error occurred while enabling listen on the socket:%d\n",mysocket);
    printf("%s",strerror(errno));
    close(mysocket);
    return -1;
}

сервер принимает вызов >>>>>>

struct sockaddr_in dest;             
int socksize=sizeof(struct sockaddr_in);
int consocket;
consocket = accept(sock, (struct sockaddr *)&dest, (socklen_t *)&socksize);
if(consocket<0) {
    printf("Error occurred while accepting on the socket:%d\n",sock);
    printf("%s\n",strerror(errno));
}

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

веселит ... Рамана

1 Ответ

0 голосов
/ 01 апреля 2011

Ваш клиент должен использовать connect ( man-страницу ) вместо accept.Серверы используют accept, чтобы принимать входящие соединения и получать новый сокет, уникальный для этого соединения, оставляя исходный файловый дескриптор свободным для прослушивания и принятия новых соединений.Клиенты просто используют один и тот же сокет после установления соединения.

Кроме того, я рекомендую взглянуть на то, как использовать select ( man-страница ).

...