有一个简单的客户端 - 服务器程序。
问题在于,当我通过执行$。/ client 127.0.0.1 5000来运行客户端时。我在服务器端终端中得到了这个。
Before Listen
After Listen
Before accept
After accept
Before read
然后,只有当我在客户端屏幕上输入消息然后按回车键。我明白了......
Here is the message: This is a message
为什么是代码进入等待 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");
答案 0 :(得分:4)
默认情况下,套接字被创建为阻塞套接字,读取调用将阻塞(等待),直到有数据被读取。
答案 1 :(得分:0)
如果您不想要读取阻止,则必须禁用阻止模式。
int flags;
flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
另请注意,read()和write()不保证它们会返回您请求的金额。这就是许多人实现readall()或writeall()函数的原因。