社区
Linux/Unix社区
帖子详情
(请高手救命啊!在线等)Socket Send的时候,不停的得到EINTR错误返回, 请问是为什么?
kkong2000
2003-08-19 10:12:02
在Redhat7.3下,多线程多CPU,在非常高频率Socket端口Send操作的时候,大概是1000次/秒以上, 持续出现EINTR错误。 有高手知道原因,或者知道怎么解决,或者知道相关网上信息的,请帮忙告知。分数不是问题!
先谢谢了!
...全文
320
12
打赏
收藏
(请高手救命啊!在线等)Socket Send的时候,不停的得到EINTR错误返回, 请问是为什么?
在Redhat7.3下,多线程多CPU,在非常高频率Socket端口Send操作的时候,大概是1000次/秒以上, 持续出现EINTR错误。 有高手知道原因,或者知道怎么解决,或者知道相关网上信息的,请帮忙告知。分数不是问题! 先谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dir1
2003-08-24
打赏
举报
回复
这可是经典问题哦,W.Richard Stevens<<UNIX Network Programming>>一书中
给出2个比较可靠的R/W函数
ssize_t readn(int fd, void *vptr, size_t n)
{
size_t nleft, bytes_read;
char *ptr;
ptr = vptr;
nleft = n;
while(n > 0)
{
if( (nread = read(fd, ptr, nleft)) < 0)
{
if(errno==EINTR) bytes_read=0;
else return(-1);
}
else if(bytes_read==0)
break; //EOF
nleft -= nread;
ptr += nread;
}
return (n - nleft);
}
ssize_t writen(int fd, void *vptr, size_t n)
{
size_t nleft, nwritten;
char* ptr;
ptr = vptr;
nleft = n;
while(nleft > 0)
{
if( (nwritten = write(fd, ptr, nleft)) < 0 )
{
if(errno == EINTR) nwritten = 0;
else return -1;
}
nleft -= nwritten;
ptr += nwritten;
}
return n;
}
其实这和win32中non-blocking socket send 很相似
salaciouswolf
2003-08-23
打赏
举报
回复
有信号中断!强烈建议搞清楚问题,看到底收到了什么信号,然后再做处理!
xiaosan_616
2003-08-23
打赏
举报
回复
salaciouswolf(好好学习) 和haiyan_qi(这个菜鸟有点冷)的观点我赞同。
你先看是那个函数返回的错误,如果无关大雅,可以像haiyan_qi说的那样,用continue语句继续。我在做ping程序时,也遇见过同样的问题。
step_by_step
2003-08-23
打赏
举报
回复
直接在代码里面判断errno的值如果是EINTR的错误的话,就continue就行了
sunshinethinking
2003-08-21
打赏
举报
回复
在你的sockfd端口队列里需要发送的char已经超过了端口最大长度,
你需要调用setsockopt将最大长度加大即可
循环的方法也可以解决,不过效率非常查
ari
2003-08-21
打赏
举报
回复
把socket写操作放到循环里
出错后判断errno 如果是EINTR,继续循环即可。
QiHY
2003-08-20
打赏
举报
回复
如果你愿意,你可以屏蔽掉所有的信号,这样就不会出现EINTR错误了
QiHY
2003-08-20
打赏
举报
回复
EINTR的产生是因为操作未结束时捕捉到了一个信号,通常发生在io操作(read,write)和状态检测(select)过程中。解决方法是把处理放在循环中,忽略EINTR错误继续处理
ssize_t readn(int fd,void *buffer,size_t length)
{
size_t bytes_left;
ssize_t bytes_read;
char *ptr;
ptr=buffer;
bytes_left=length;
while(bytes_left>0)
{
bytes_read=read(fd,ptr,bytes_left);
if(bytes_read<0)
{
if(errno==EINTR)
bytes_read=0;
else
return(-1);
}
else if(bytes_read==0)
break;
bytes_left-=bytes_read;
ptr+=bytes_read;
}
return length-bytes_left;
}
kkong2000
2003-08-19
打赏
举报
回复
不好意思,我实在有的没有招了,项目快结束,客户特关注这个问题。所以,我在LINUX和UNIX组,都发了这个贴子。
我是在对Socket写入数据的时候,出现这样的问题的。 中间包括多线程对同一个Socket写数据。但是,我测试过,这样是没有问题的。
wwwunix
2003-08-19
打赏
举报
回复
呵呵,不需要发这么多贴吧。
你是不是在调用select()时出现的EINTR错误?
kkong2000
2003-08-19
打赏
举报
回复
帮忙顶的,一定有分相报,谢谢啦!
kkong2000
2003-08-19
打赏
举报
回复
这个问题,好像在“UNIX Socket FAQ”中,谈到
21. Why do I keep getting EINTR from the socket calls?
但是,找来找去就是找不到对于这个问题的解释,也不能找到关于这个问题的一个解决方法。
有没有搞UNIX的朋友,有相关的资料啊!
先谢了!
socket
编程中的E
INT
R是什么?
socket
编程中的E
INT
R是什么?
socket
send
返回
值_Linux网络编程中
socket
常见
错误
分析
socket
错误
码:E
INT
R: 4阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种
错误
。只能针对阻塞模式的
socket
。读,写阻塞的
socket
时,-1
返回
,
错误
号为
INT
R。另外,如果出现E
INT
R即errno为4,
错误
描述
Int
errupted system call,操作也应该继续。如果recv的
返回
值为0,那表明连接已经断开,接收操作也应该结束。ETIMEOUT:110...
Linux -
socket
编程处理E
INT
R
错误
Linux -
socket
编程处理E
INT
R
错误
Linux -
socket
编程处理E
INT
R
错误
在linux的
socket
编程中,经常要处理E
INT
R
错误
,其值为4,用strerror(errno)调用
返回
的
错误
描述为:
Int
errupted system call. 这里给出一个connect连接中对E
INT
R处理的网址: http://
Socket
通信——Linux下,errno=E
INT
R的
错误
处理
socket
接口,例如recv接口会做2件事情: 1.检查buffer是否有数据,有则复制清除
返回
2.没有数据,则进入睡眠模式,当超时、数据到达、发生
错误
则唤醒进程处理 采用睡眠来等待,发生信号的时候进程会被唤醒,
socket
接口唤醒后检查有无未处理的信号(signal_pending)会
返回
E
INT
R
错误
。 处理方式,无需理会,重新运行该函数。 以下为封装好的函数处理,引用wrap.h,替
linux
socket
错误
处理,Linux -
socket
编程处理E
INT
R
错误
在linux的
socket
编程中,经常要处理E
INT
R
错误
,其值为4,用strerror(errno)调用
返回
的
错误
描述为:
Int
erruptedsystem call. 这里给出一个connect连接中对E
INT
R处理的网址:另外转载网络上其他兄弟对E
INT
R
错误
的处理:1.accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为E
INT
R,此时应重新调用accept()。...
Linux/Unix社区
23,121
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章