【问题标题】:accept() call does not blocks second timeaccept() 调用不会阻塞第二次
【发布时间】:2010-07-05 15:28:15
【问题描述】:

我写了一个小服务器

#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

我错过了什么吗?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    这里的这一行:

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

    是,容我们说,相当有趣。

    为什么要把newsock_fd的地址作为第二个参数呢?那只是自找麻烦:-)

    我认为应该是:

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

    【讨论】:

      【解决方案2】:
      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);
      

      您传递的是指向文件描述符的指针,而不是 struct sockaddr。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2016-12-29
        • 1970-01-01
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多