2013-03-16 47 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; 

创建一个新的socketLinux的插座接受不能被阻止

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 - >检查errno。同时检查read()的返回值() – wildplasser 2013-03-16 13:28:27

+0

套接字将在默认情况下被阻塞,因此不需要执行fcntl调用。 'unlink'调用也是不必要的。其次,你必须**检查可能失败的'bind'的返回值(以及'listen','socket'等等)。 – 2013-03-16 13:33:35

回答

1

可以client_addressclient_sockfd之间发生不匹配。

man page of accept()说:

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. 

尝试:

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

非常感谢 – jinux 2013-03-18 08:49:13