jinux
jinux

Reputation: 163

linux socket accept can't been blocked

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

create a new socket

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

name it

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

set block

    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

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

it is blocked at first time

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

when the client connected first,I work,but the next won't work

Upvotes: 0

Views: 487

Answers (1)

Aubin
Aubin

Reputation: 14883

A mismatch may occurs between client_address and client_sockfd.

The man page of accept() says:

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

Upvotes: 1

Related Questions