2010-04-02 58 views
-1

有一个简单的客户端 - 服务器程序。无法理解read()系统调用

  • 服务器启动$。/服务器5000
  • 客户端也被连接到服务器.. $。/客户端127.0.0.1 5000
  • 客户端进入一个字符串
  • 客户端有消息“我有你的消息”,他的终端上显示&服务器客户端显示输入的字符串

的问题是,当我做$运行客户端。/客户127.0.0.1 5000我在服务器端得到这个终奌站。

Before Listen 
After Listen 
Before accept 
After accept 
Before read 

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

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

回答

4

默认情况下,插座被创建为阻止套接字和读通话将阻止(等待),直到有数据被读取。

+1

我们输入了几乎相同的答案:) +1 – 2010-04-02 13:49:40

+0

ohk。我不知道这个.. Thanx .. – 2010-04-02 13:57:13

0

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

int flags; 

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

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