URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1318
[ Назад ]

Исходное сообщение
"Проблема с сокетами."

Отправлено mikek , 27-Янв-03 17:05 
Пишу небольшой сервер. Все работает. Только два нюанса. После того, как accept первый раз возвращает «-1», последующие вызовы этой функции начинают возвращать «0» вместо IP адреса.

Вот кусочек кода:

        memset(&c_sock_info,0,addr_length);
        c_sock=accept(m_sock,(struct sockaddr *)&c_sock_info,(socklen_t*)&addr_length);
            
        if (c_sock<=0) continue;
        if (c_sock>0) {
            sendbuff_size=0;
            sendbuff[0]=0;
            memset(buf,0,MAXRECV+1);
            int status=recv(c_sock,buf,MAXRECV,O_NONBLOCK);
            char *ip=strdup(inet_ntoa(c_sock_info.sin_addr));

Вторая проблема в том, что сервер попросту вываливается, если в MSIE просто подержать F5. При тестировании через ab все работает, даже с большим колличество параллельных запросов.

Может кто-то встречался с такой проблемой?


Содержание

Сообщения в этом обсуждении
"RE: Проблема с сокетами."
Отправлено vnp , 27-Янв-03 21:09 
>Пишу небольшой сервер. Все работает. Только два нюанса. После того, как accept
>первый раз возвращает ?-1?,

С каким errno?

>последующие вызовы этой функции начинают возвращать ?0?
>вместо IP адреса.
>
>Вот кусочек кода:
>
>        memset(&c_sock_info,0,addr_length);
>        c_sock=accept(m_sock, (struct sockaddr *) &c_sock_info, (socklen_t*) &addr_length);

Как создан m_sock?

>
>        if (c_sock<=0) continue;
>        if (c_sock>0) {
>            
>sendbuff_size=0;
>            
>sendbuff[0]=0;
>            
>memset(buf,0,MAXRECV+1);
>            
>int status=recv(c_sock,buf,MAXRECV,O_NONBLOCK);
>            
>char *ip=strdup(inet_ntoa(c_sock_info.sin_addr));
>...
>
>Вторая проблема в том, что сервер попросту вываливается, если в MSIE просто
>подержать F5. При тестировании через ab все работает, даже с большим
>колличество параллельных запросов.
>
>Может кто-то встречался с такой проблемой?