C 无法理解read()系统调用

C 无法理解read()系统调用,c,unix,sockets,C,Unix,Sockets,有一个简单的客户机-服务器程序 服务器已启动$。/服务器5000 客户端还连接到服务器..$/客户127.0.0.1 5000 客户端输入一个字符串 客户端在其终端上显示消息“我收到了您的消息”&服务器显示客户端输入的字符串 问题是,当我通过执行$./client 127.0.0.1 5000运行客户端时。我在服务器端终端得到这个 Before Listen After Listen Before accept After accept Before read 然后,只有当我在客户端屏

有一个简单的客户机-服务器程序

服务器已启动$。/服务器5000 客户端还连接到服务器..$/客户127.0.0.1 5000 客户端输入一个字符串 客户端在其终端上显示消息“我收到了您的消息”&服务器显示客户端输入的字符串 问题是,当我通过执行$./client 127.0.0.1 5000运行客户端时。我在服务器端终端得到这个

Before Listen 
After Listen 
Before accept 
After accept 
Before read
然后,只有当我在客户端屏幕上输入消息,然后按enter键时。我把这个展示出来

Here is the message: This is a message
为什么代码会进入等待状态 读取调用前的状态。。不应该吗 只需不读取任何内容并返回0

我在某个概念上错了。请帮帮我

客户相关代码:-

if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
        error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    printf("%d\n",n);
    if (n < 0) 
        error("ERROR reading from socket");
    printf("%s\n",buffer);
相关服务器代码:-

if (bind(sockfd, (struct sockaddr *) &serv_addr,
                sizeof(serv_addr)) < 0) 
        error("ERROR on binding");
    printf("Before Listen ");
    listen(sockfd,5);
    printf("After Listen ");
    clilen = sizeof(cli_addr);
    printf("Before accept ");
    newsockfd = accept(sockfd, 
            (struct sockaddr *) &cli_addr, 
            &clilen);
    printf("After accept");
    if (newsockfd < 0) 
        error("ERROR on accept");
    bzero(buffer,256);
    printf("Before read");
    n = read(newsockfd,buffer,255);
    if (n < 0) error("ERROR reading from socket");
    printf("Here is the message: %s\n",buffer);
    n = write(newsockfd,"I got your message",18);
    if (n < 0) error("ERROR writing to socket");

默认情况下,套接字被创建为阻塞套接字,读取调用将阻塞,直到有数据要读取。

如果您不希望读取阻塞,则必须禁用阻塞模式

int flags;

flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);

还要注意的是,读和写并不保证他们会返回您请求的金额。这就是为什么许多人实现readall或writeall函数。

我们键入了几乎相同的答案:+1