2010-07-05 6 views
0

j'ai écrit un petit serveuraccept() appel ne bloque la deuxième fois

#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; 
} 

Quand je l'exécuter, l'accepter blocs appels au départ, mais après avoir créé le nouveau socket, il ne met pas des blocs pour la deuxième fois. Je reçois ce type de sortie: -

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 

Est-ce que je manque quelque chose?

Répondre

3

Cette ligne ici:

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

est, dirons-nous plutôt intéressant.

Pourquoi donnez-vous l'adresse de votre newsock_fd comme second paramètre? C'est juste d'avoir des ennuis :-)

Je pense qu'il devrait probablement:

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

Il s'agit d'une faute de frappe. Merci. Maintenant ça fonctionne bien – Ashish

1
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); 

De accept(2):

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

Vous êtes passer un pointeur sur un descripteur de fichier, pas une struct sockaddr.

Questions connexes