(请高手救命啊!在线等)Socket Send的时候,不停的得到EINTR错误返回, 请问是为什么?

kkong2000 2003-08-19 10:12:02
在Redhat7.3下,多线程多CPU,在非常高频率Socket端口Send操作的时候,大概是1000次/秒以上, 持续出现EINTR错误。 有高手知道原因,或者知道怎么解决,或者知道相关网上信息的,请帮忙告知。分数不是问题!

先谢谢了!
...全文
318 12 打赏 收藏 转发到动态 举报
写回复
用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的朋友,有相关的资料啊!
先谢了!

23,120

社区成员

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

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