|
|
|
|
 为什么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)]
|
|
|
|
[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]
|
|
[Original]
[Print]
[Top]
|
perror() 会改变errno的值,你应该调用perror()之前保存errno
非阻塞的socket,正常情况下,非错误的发送失败应该是EAGAIN,
既然用了非阻塞 IO,就应该用select/poll机制,否则将造成忙循环,严重降低系统性能
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
非常感谢Atu
我查了一下,"resource temporarily unavailable"就是EAGAIN
还有,我现在用select先检测所有套接字,如果某套接字在可写的fd_set中,我再调用send发送,
可这样send后还会产生"resource temporarily unavailable"错误,那为什么select检测到可写了,
却不能顺利发送呢?我的理解是只要select检测到可写,就一定能立即发送出去!
如果返回"resource temporarily unavailable"是正常现象,应该如何处理,是让它不断的发送,
直到发送完毕?
谢谢!!
|
|
|
[Original]
[Print]
[Top]
|
|
[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]
|
|
[Original]
[Print]
[Top]
|
while(sendlen != 0)//循环发送,直到发送完毕
{
} //while(sendlen != 0)
这里为什么要循环直到发送完成呢?
因为第一次发送完成后,就已经改变了该连接的状态——它将从可写变成不可写了——可能是网络缓冲区满了,
所以,你应该每次select返回后,只做一次send操作,然后再次进入select等待,
当然你要为每个连接增加一个记录上次发送位置的记录。
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
谢谢Atu的指教!
还有个问题要麻烦大侠一下:server如何得到client关闭的消息,或反之!
包括对方使用closesocket(),非法退出程序或物理线路中断(网线断开)几种情况!
因为现在要写个中间程序,即要接收client的连接,又要给其他server转发数据,
我只知道对方退出了,本方再recv会返回错误!
我想知道什么才是正规的判断退出的方法!
谢谢!
|
|
[Original]
[Print]
[Top]
|
|
[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]
|
|
|