2013-03-16 2 views
0
#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <unistd.h> 
    #include <fcntl.h> 
    #include <netinet/in.h> 
    #include <arpa/inet.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 

    int main() 
    { 
    int server_sockfd,client_sockfd; 
    int server_len,client_len; 
    struct sockaddr_in server_address; 
    struct sockaddr_in client_address; 

создать новый сокетLinux сокет принимает не был заблокирован

unlink("server_socket"); 
    server_sockfd=socket(AF_INET,SOCK_STREAM,0); 

имя его

server_address.sin_family=AF_INET; 
    server_address.sin_addr.s_addr=htonl(INADDR_ANY); 
    server_address.sin_port=htons(9734); 
    server_len=sizeof(server_address); 
    bind(server_sockfd,(struct sockaddr *)&server_address,server_len); 

комплект блок

int flags=fcntl(server_sockfd,F_GETFL,0); 
    if(flags&O_NONBLOCK==1){ 
     printf("NONBLOCK"); 
    }else{ 
     printf("BLOCK"); 
    } 
    flags=flags&~O_NONBLOCK; 
    fcntl(server_sockfd,F_SETFL,flags); 
    if(flags&O_NONBLOCK==1){ 
     printf("NONBLOCK"); 
    }else{ 
     printf("BLOCK"); 
    } 

слушать

listen(server_sockfd,5); 
    while(1){ 
     char ch; 
     printf("server waiting\n"); 
     client_len=sizeof(client_address); 
     client_sockfd= 
      accept(server_sockfd,(struct sockaddr*)&client_sockfd,&client_len); 

он блокируется в первый раз

 read(client_sockfd,&ch,1); 
     ch++; 
     write(client_sockfd,&ch,1); 
     close(client_sockfd); 
    } 
} 

, когда клиент подключен первый, я работать, но следующий не будет работать

+1

'client_sockfd = accept' Проверьте значение client_socket. Это может быть -1 -> check errno. Также проверьте возвращаемое значение из read() – wildplasser

+0

Сокет будет блокироваться по умолчанию, поэтому нет необходимости выполнять вызовы fcntl. Вызов 'unlink' совершенно не нужен. Во-вторых, вы ** должны ** проверить возвращаемое значение 'bind', которое, скорее всего, не работает (и' listen', 'socket' и т. Д. Тоже ...). –

ответ

1

Несоответствие может происходит между client_address и client_sockfd.

man page of accept() The говорит:

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

The addrlen argument is a value-result argument: the caller must initialize it to 
contain the size (in bytes) of the structure pointed to by addr; on return it 
will contain the actual size of the peer address. 

Try:

client_sockfd= 
    accept(server_sockfd, (struct sockaddr*)&client_address, &client_len); 
+0

Большое спасибо – jinux

Смежные вопросы