【问题标题】:Unable to understand read() system call无法理解 read() 系统调用
【发布时间】:2010-04-02 13:44:18
【问题描述】:

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

  • 服务器启动 $./server 5000
  • 客户端也连接到服务器.. $./client 127.0.0.1 5000
  • 客户端输入字符串
  • 客户端在其终端上显示消息“我收到了您的消息”,服务器显示客户端输入的字符串

问题是当我通过 $./client 127.0.0.1 5000 运行客户端时。我在服务器端终端中得到了这个。

Before Listen 
After Listen 
Before accept 
After accept 
Before read

只有当我在客户端屏幕上输入消息然后按回车时。我得到这个显示..

Here is the message: This is a message

为什么是代码进入了wait read() 调用之前的状态.. 不应该 什么都不读,然后返回 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");

【问题讨论】:

    标签: c unix sockets


    【解决方案1】:

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

    【讨论】:

    • 我们输入了几乎相同的答案 :) +1
    【解决方案2】:

    如果您不想阻止读取,则必须禁用 BLOCKING 模式。

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

    另请注意,read() 和 write() 不保证它们会返回您请求的金额。这就是为什么很多人实现 readall() 或 writeall() 函数的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2011-06-18
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多