linux下套接字问题

老妖妖妖妖妖妖 2014-01-07 10:40:06
我在非阻塞下用writev发送数据,发送一会,writev返回-1,perror就打印No such file or directory,请问各路高手有知道这是什么原因么?我也想改成阻塞的,但是特么的领导不让,帮帮小弟吧。
...全文
156 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
int loopWriteV(int _isockfd, struct iovec *_iov, int _iovcnt)
{
int iret = 0; 
int i = 0;
int itmplen0 = 0;
int itmplen1 = 0;
int itmplen2 = 0;

for(i = 0; i < _iovcnt; i++)
{
itmplen0 += _iov[i].iov_len;
}


int w;

i = 0;//归零
while(itmplen0 > 0)
{

itmplen1 = writev(_isockfd, _iov + i, _iovcnt - i);
if(itmplen1 == itmplen0)
{
break;
}
else if(itmplen1 <= 0)
{
if((errno == EINTR) ||(errno == EAGAIN))
{
continue;
}
else
{
perror("what the fucking what");
iret = -1;
goto leave;
}
}
else// if(itmplen1 < itmplen0)
{

itmplen0 -= itmplen1;
itmplen2 = 0;

for(; i < _iovcnt; i++)
{
itmplen2 += _iov[i].iov_len;

if(itmplen2 > itmplen1)
{
//此处指针偏移错误
//_iov[i].iov_base +=  (itmplen2 - itmplen1);
//_iov[i].iov_len -= (itmplen2 - itmplen1);

break;
}
else if(itmplen2 == itmplen1)
{
i++;
break;
}
}
}
}
leave: 
return iret;
}
我找到原因了,还是要感谢各位的回答。
没拦住車 2014-01-07
  • 打赏
  • 举报
回复
1, No such file or directory : 没有文件路径 可能是socket的参数是不是正确;文件(资源)路径是否正确;指定的文件(资源)是否有读写权限 2, 不让变成阻塞 可能是怕程序卡死吧 3, 其他的就不知道了
  • 打赏
  • 举报
回复
我是根据writev返回值,然后while里发送,代码如下, 可有不合理的地方??? int loopWriteV(int _isockfd, struct iovec *_iov, int _iovcnt) { int iret = 0; int i = 0; int itmplen0 = 0; int itmplen1 = 0; int itmplen2 = 0; for(i = 0; i < _iovcnt; i++) { itmplen0 += _iov[i].iov_len; } int w; i = 0;//归零 while(itmplen0 > 0) { itmplen1 = writev(_isockfd, _iov + i, _iovcnt - i); if(itmplen1 == itmplen0) { break; } else if(itmplen1 <= 0) { if((errno == EINTR) ||(errno == EAGAIN)) { continue; } else { perror("what the fucking what"); iret = -1; goto leave; } } else// if(itmplen1 < itmplen0) { itmplen0 -= itmplen1; itmplen2 = 0; for(; i < _iovcnt; i++) { itmplen2 += _iov[i].iov_len; if(itmplen2 > itmplen1) { _iov[i].iov_base += (itmplen2 - itmplen1); _iov[i].iov_len -= (itmplen2 - itmplen1); break; } else if(itmplen2 == itmplen1) { i++; break; } } } } leave: return iret; }
氰客 2014-01-07
  • 打赏
  • 举报
回复

writev:成功返回write字节数,失败返回-1,用 error()获取错误码,
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
检查下你发送的时候 socket套接字是否有效!
版主老大 ,这个怎么检查呀?不应该根据writev的返回值检查吗?返回值是-1,我这面没有关闭socket,如果对端关闭的话不应该是reset by peer吗?
max_min_ 2014-01-07
  • 打赏
  • 举报
回复
检查下你发送的时候 socket套接字是否有效!

70,026

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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