URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 28 » 为什么errno与perror不相符
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
为什么errno与perror不相符
为什么errno与perror不相符 - worldcup [2005-07-26 11:55 | 507 byte(s)]
 
Re: 为什么errno与perror不相符 - Atu [2005-07-26 12:23 | 244 byte(s)]
 
Re: 为什么errno与perror不相符 - worldcup [2005-07-26 16:18 | 565 byte(s)]
 
Re: 为什么errno与perror不相符 - Atu [2005-07-26 16:41 | 56 byte(s)]
 
Re: 为什么errno与perror不相符 - worldcup [2005-07-27 09:22 | 920 byte(s)]
 
Re: 为什么errno与perror不相符 - Atu [2005-07-27 09:40 | 411 byte(s)]
 
Re: 为什么errno与perror不相符 - worldcup [2005-07-27 18:18 | 399 byte(s)]
 
Re: 为什么errno与perror不相符 - Atu [2005-07-27 18:36 | 1,853 byte(s)]
 
Re: 为什么errno与perror不相符 - worldcup [2005-07-28 10:40 | 7 byte(s)]
 
Subject: 为什么errno与perror不相符
Author: worldcup    Posted: 2005-07-26 11:55    Length: 507 byte(s)
[Original] [Print] [Top]
我在调用send()发送数据后,出错,通过perror打印显示:Resource temporarily unavailable
可我再打印出errno变量的值为29,即"illedge seek",而且我查了errno.h中并没有"Resource temporarily unavailable"错误,请问这是为什么?"Resource temporarily unavailable"是从哪里出来的?

顺便请教一下,我的socket是非阻塞的,返回"Resource temporarily unavailable"错误说明了什么,是不是
收到这个错误,不用去管,继续发送,直到send成功,是这样吗?

谢谢!
[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: Atu    Posted: 2005-07-26 12:23    Length: 244 byte(s)
[Original] [Print] [Top]
perror() 会改变errno的值,你应该调用perror()之前保存errno

非阻塞的socket,正常情况下,非错误的发送失败应该是EAGAIN,
既然用了非阻塞 IO,就应该用select/poll机制,否则将造成忙循环,严重降低系统性能

[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: worldcup    Posted: 2005-07-26 16:18    Length: 565 byte(s)
[Original] [Print] [Top]
非常感谢Atu

我查了一下,"resource temporarily unavailable"就是EAGAIN

还有,我现在用select先检测所有套接字,如果某套接字在可写的fd_set中,我再调用send发送,
可这样send后还会产生"resource temporarily unavailable"错误,那为什么select检测到可写了,
却不能顺利发送呢?我的理解是只要select检测到可写,就一定能立即发送出去!

如果返回"resource temporarily unavailable"是正常现象,应该如何处理,是让它不断的发送,
直到发送完毕?

谢谢!!

[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: Atu    Posted: 2005-07-26 16:41    Length: 56 byte(s)
[Original] [Print] [Top]
可否把你select相关的代码贴出来看看?

[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: worldcup    Posted: 2005-07-27 09:22    Length: 920 byte(s)
[Original] [Print] [Top]
while(1)
{
fd_set_setup(); //将所检测的socket置于writeFdSet中
select_ret = select(sockmax+1,NULL,&writeFdSet, NULL, NULL);
if(select_ret <= 0) continue;

if(FD_ISSET(skt,&writeFdSet))
{
send_ret = 0;
while(sendlen != 0)//循环发送,直到发送完毕
{
send_ret = send(skt,sp+send_ret,sendlen,MSG_DONTWAIT|MSG_NOSIGNAL);//non-block
if (send_ret==-1 )
{
perror("send error");//有时打印resource temporarily unavailable
}
else
{
sendlen -= send_ret;
}
} //while(sendlen != 0)
}//if(FD_ISSET(skt,&writeFdSet))
}//while(1)

该段代码位于一个单独的pthread线程中,请大家多多指教!
谢谢!!

[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: Atu    Posted: 2005-07-27 09:40    Length: 411 byte(s)
[Original] [Print] [Top]
while(sendlen != 0)//循环发送,直到发送完毕
{
} //while(sendlen != 0)

这里为什么要循环直到发送完成呢?
因为第一次发送完成后,就已经改变了该连接的状态——它将从可写变成不可写了——可能是网络缓冲区满了,
所以,你应该每次select返回后,只做一次send操作,然后再次进入select等待,
当然你要为每个连接增加一个记录上次发送位置的记录。

[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: worldcup    Posted: 2005-07-27 18:18    Length: 399 byte(s)
[Original] [Print] [Top]
谢谢Atu的指教!

还有个问题要麻烦大侠一下:server如何得到client关闭的消息,或反之!
包括对方使用closesocket(),非法退出程序或物理线路中断(网线断开)几种情况!
因为现在要写个中间程序,即要接收client的连接,又要给其他server转发数据,
我只知道对方退出了,本方再recv会返回错误!
我想知道什么才是正规的判断退出的方法!

谢谢!

[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: Atu    Posted: 2005-07-27 18:36    Length: 1,853 byte(s)
[Original] [Print] [Top]
呵呵,说不清楚啦

你去找《Unix网络编程》第一卷来看吧

那里针对你所说的情况进行了详细的讨论


Chapter 5. TCP Client-Server Example 111

5.1 Introduction 111
5.2 TCP Echo Server: main Function 112
5.3 TCP Echo Server: str_echo Function 113
5.4 TCP Echo Client: main Function 113
5.5 TCP Echo Client: str_cli Function 115
5.6 Normal Startup 115
5.7 Normal Termination 117
5.8 Posix Signal Handling 119
5.9 Handling SIGCHLD Signals 122
5.10 wait and waitpid Functions 124
5.11 Connection Abort before accept Returns 129
5.12 Termination of Server Process 130
5.13 SIGPIPE Signal 132
5.14 Crashing of Server Host 133
5.15 Crashing and Rebooting of Server Host 134
5.16 Shutdown of Server Host 135
5.17 Summary of TCP Example 135
5.18 Data Format 137
5.19 Summary 140

Chapter 6. I/O Multiplexing: The select and poll Functions 143

6.1 Introduction 143
6.2 I/O Models 144
6.3 select Function 150
6.4 str_cli Function (Revisited) 155
6.5 Batch Input 157
6.6 shutdown Function 160
6.7 str_cli Function (Revisited Again) 161
6.8 TCP Echo Server (Revisited) 162
6.9 pselect Function 168
6.10 poll Function 169
6.11 TCP Echo Server (Revisited Again) 172
6.12 Summary 175

[Original] [Print] [Top]
Subject: Re: 为什么errno与perror不相符
Author: worldcup    Posted: 2005-07-28 10:40    Length: 7 byte(s)
[Original] [Print] [Top]
谢谢Atu
[Original] [Print] [Top]
« Previous thread
_CODE_ACCESS是什么意思
C/C++编程版
28
Next thread »
UNIX/LINUX编程教程时有fd=make_server_socket(atoi(av[1]))
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:44, cost 0.060699939727783 ms.