不知道是不是应该发在这里,看了一下这里好像主要是交流网络配置的?但其它更想不出什么地方了。内容比较多,请大家见谅。
在阻塞式的socket中,recv/read调用肯定不一定返时刚好读满缓冲区(即使对端没有关闭还在发送),这个比较容易理解,也很容易测试出来。但对于send的返回值,许多资料中讲得都很含糊,在MSDN中说是“非阻塞的socket有可能发送成功而返回的值小于要发送的长度“,即只发送了一部分出去,感觉言下之义就是阻塞式的只要发送成功就肯定是指定的发送长度,和文件写一样。Linux/FreeBSD中man手册都没有明确的说明,只说成功时返回发送的数据字节数,失败返回-1。
以前刚学网络时看的是《UNIX网络编程》的第二版,现在俺这本书找不到了,于是找了一本第三版的电子书看,但浏览了一下没看到什么说明。这个发送实际上以前就比较困惑,由于自己不做网络开发也没有专门测试过,问过一些专门做网络的好像也不是很清楚;而接收如果按每次能收满这个在工作中是见到过问题的。
《UNIX网络编程》第三版的代码:
[Copy to clipboard] [ - ]CODE:[color=Navy]
ssize_t /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
/* end writen */
[/color]
vsFTP中的代码:
[Copy to clipboard] [ - ]CODE:int
vsf_sysutil_write_loop(const int fd, const void* p_buf, unsigned int size)
{
int retval;
int num_written = 0;
会员注册
会员登录
个人空间
发表评论