调用read函数读取socket流时,为何返回值总是1

qytan36 2010-06-06 10:08:53
最近在Linux下面用Socket写一个httpclient,主要代码如下:
int sockfd = createtcpsocket(AF_INET);
struct sockaddr addr;
createsockaddr(ip, 80, &addr); //帮定到目标机器80端口
int status = connect(sockfd, &addr, sizeof(addr)); //连接
if(status == 0)
{
cout << "Connect to " << hoststr << "(" << ipstr << ")\n" << request << endl;
int n =write(sockfd, request.c_str(), request.length());
assert(n == request.length());
char buffer[1024];
n = 0;
string message;
while(n = read(sockfd, buffer, 1023) > 0)
{
//buffer[n] = '\0';
cout << n << endl; //在调试的时候,这里n总是1,但是实际buffer中的数据却已经读满了,不知道为何?
message.append(buffer, 1023);
}

在实际运行过程中,发现是能够成功获取服务器断返回的httpresponse信息,但是read函数每次均返回1,可是实际每次成功读取字符数并不是1,
请大侠赐教

谢谢
...全文
630 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qytan36 2010-06-06
  • 打赏
  • 举报
回复
楼上正解,我犯了个低级错误。谢谢!
太乙 2010-06-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mymtom 的回复:]
(n = read(sockfd, buffer, 1023) > 0)
等价于
(n = (read(sockfd, buffer, 1023) > 0))

应该改为
((n = read(sockfd, buffer, 1023)) > 0)
[/Quote]up~~~呵呵。。。忽略1/2楼~~~
mymtom 2010-06-06
  • 打赏
  • 举报
回复
(n = read(sockfd, buffer, 1023) > 0)
等价于
(n = (read(sockfd, buffer, 1023) > 0))

应该改为
((n = read(sockfd, buffer, 1023)) > 0)
太乙 2010-06-06
  • 打赏
  • 举报
回复
3、阻塞模式下read返回值 < 0 && errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN时,连接异常,需要关闭,read返回值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)时表示没有数据,需要继续接收,如果返回值大于0表示接送到数据。

非阻塞模式下read返回值 < 0表示没有数据,= 0表示连接断开,> 0表示接收到数据。
太乙 2010-06-06
  • 打赏
  • 举报
回复
read返回值不代表你成功读入的字符数!

只要>0即使成功读取~~!

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧