LINUX.ORG.RU

Проблема с сокетами.


0

0

Пишу небольшой сервер. Все работает. Только два нюанса. После того, как 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)); &#8230;

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

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


Мне лень было разбираться в коде, но попробуй так:

Айпи адрес будет в переменной IP, все чтенние производи из дочерней функции.

int main(){
int s1,s,peerlen;
struct sockaddr_in local, peer;
char ip[18];

/*
Тут создаешь сокеты все такое...
*/
peerlen=sizeof(peer);
while(1)
{
if((s1=accept(s,(struct sockaddr *)&peer, &peerlen))<0)
continue;
ip=inet_ntoa(peer.sin_addr);
server(s1);
}
}

server(int s1){
/*
Эта ф-ция форкается (для каждого соединения),
и из нового процесса уже начинается чтение.отправка данных.
*/

pid_t pid=fork()
/*Проверяешь пид и если ты ы чайлде то делай это... ->*/

int status;
#define MAXRECV 256
static char buf[MAXRECV];
status=recv(s1,buf,MAXRECV,O_NONBLOCK);
buf[status]='\0';
return buf;
}

Почитай мануалы. Если что, пиши xidden@mail.ru, пришлю работающий ,провереный код для сервера.

OxiD ★★★★
()

Упс, только я там кое-шде точку с запятой пропустил и ф-ция server должна быть типа (char *)

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.