вызов accept () не блокирует второй раз - PullRequest
0 голосов
/ 05 июля 2010

Я написал небольшой сервер

#include <stdio.h>
#include <netinet/in.h>
#include <sys/types.h>

int main()
{
int server_fd, newsock_fd, server_len, newsock_len;
struct sockaddr_in server_struct, newsock_struct;

server_fd=socket(AF_INET,SOCK_STREAM,0);
server_struct.sin_family=AF_INET;
server_struct.sin_addr.s_addr=inet_addr("127.0.0.1");
server_struct.sin_port=htons(9734);
server_len=sizeof(server_struct);
newsock_len=server_len;

bind(server_fd,(struct sockaddr *)&server_struct,server_len);

listen(server_fd,5);

while(1)
{
printf("server waiting\n");
newsock_fd=accept(server_fd,(struct sockaddr *)&newsock_fd,&newsock_len);
char ch;
read(newsock_fd,&ch,1);
printf("got charachter %c\n",ch);
close(newsock_fd);
}
return 0;
}

Когда я запускаю его, сначала вызовы accept блокируются, но после создания нового сокета он не блокируется во второй раз. Я получаю этот тип вывода: -

server waiting <= blocks initially , started client
got charachter a <= correctly displays the charachetr
server waiting <= expected to be blocked again ????
got charachter a 
server waiting
got charachter a
server waiting

Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 05 июля 2010

Эта строка здесь:

newsock_fd=accept(server_fd,(struct sockaddr *)&newsock_fd,&newsock_len);

это, скажем так, довольно интересно.

Почему вы указали адрес вашего newsock_fd в качестве второго параметра? Это просто напрашивается на неприятности: -)

Я думаю, это должно быть:

newsock_fd = accept (server_fd, (struct sockaddr *)&newsock_struct, &newsock_len);
1 голос
/ 05 июля 2010
int server_fd, newsock_fd, server_len, newsock_len;
struct sockaddr_in server_struct, newsock_struct;
/* ... */
newsock_fd=accept(server_fd,(struct sockaddr *)&newsock_fd,&newsock_len);

С accept(2):

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

Вы передаете указатель на дескриптор файла, а не на структуру sockaddr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...