linux下套接字问题

老妖妖妖妖妖妖 菜鸟工程师  2014-01-07 10:40:06
我在非阻塞下用writev发送数据,发送一会,writev返回-1,perror就打印No such file or directory,请问各路高手有知道这是什么原因么?我也想改成阻塞的,但是特么的领导不让,帮帮小弟吧。
...全文
105 点赞 收藏 6
写回复
6 条回复
老妖妖妖妖妖妖 2014年01月08日
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, 其他的就不知道了
回复 点赞
老妖妖妖妖妖妖 2014年01月07日
我是根据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()获取错误码,
回复 点赞
老妖妖妖妖妖妖 2014年01月07日
引用 3 楼 max_min_ 的回复:
检查下你发送的时候 socket套接字是否有效!
版主老大 ,这个怎么检查呀?不应该根据writev的返回值检查吗?返回值是-1,我这面没有关闭socket,如果对端关闭的话不应该是reset by peer吗?
回复 点赞
max_min_ 2014年01月07日
检查下你发送的时候 socket套接字是否有效!
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告