Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C write()和send()解决错误=>;区别?_C_Sockets_Send - Fatal编程技术网

C write()和send()解决错误=>;区别?

C write()和send()解决错误=>;区别?,c,sockets,send,C,Sockets,Send,这两个函数在解决错误方面有什么不同吗?: 这个问题给我带来了另一个问题。。。字符数是否始终与字节数相同 更多信息:我在Linux上的C中使用它进行TCP套接字通信(sys/socket.h) 谢谢你的回复 返回: write(): 成功时,返回写入的字节数(零表示未写入任何内容)。在出现错误时,返回-1,并正确设置errno。如果count为零,并且文件描述符引用常规文件,则将返回0,而不会造成任何其他影响。对于特殊文件,结果不可移植。 send(): 调用返回发送的字符数,如果发生错误,

这两个函数在解决错误方面有什么不同吗?:
这个问题给我带来了另一个问题。。。字符数是否始终与字节数相同
更多信息:我在Linux上的C中使用它进行TCP套接字通信(sys/socket.h) 谢谢你的回复


返回:
write():
成功时,返回写入的字节数(零表示未写入任何内容)。在出现错误时,返回-1,并正确设置errno。如果count为零,并且文件描述符引用常规文件,则将返回0,而不会造成任何其他影响。对于特殊文件,结果不可移植。

send():
调用返回发送的字符数,如果发生错误,则返回-1。

stackoverflow提出的问题,该方法应与使用零标志相同。


在这种情况下,它们都将返回相同数量的写入字节(=个字符)。请注意:

如果消息太长,无法通过底层协议原子地传递,则 返回错误EMSGSIZE,并且不传输消息


换句话说,根据写入数据的大小,write()可能成功,而send()可能失败。

字节数==字符数,因为C标准要求
char
为1字节整数

write()
: 是的,它返回写入的字节数。但是:如果它返回的字节数没有它应该写入的字节数那么多,这并不总是一个错误。特别是对于TCP通信来说。套接字可能是非阻塞的或只是忙的,在这种情况下,您需要重写尚未写入的字节。这种行为可以通过如下方式实现:

char *buf = (however you acquire your byte buffer);
ssize_t len = (total number of bytes to be written out);

while (len > 0)
{
    ssize_t written = write(sockfd, buf, len);
    if (written < 0)
    {
        /* now THAT is an error */
        break;
    }
    len -= written;
    buf += written; /* tricky pointer arythmetic */
}

您可以在

右侧看到我使用此技术实现的一个简单TCP helper类,如果套接字是非阻塞的,则规则会更改。但是TCP默认处于阻塞模式?因此我不应该像这样复杂?在这种情况下..
write()可能成功,而send()可能失败
,这种行为是否发生在TCP套接字上?
char *buf = (however you acquire your byte buffer);
ssize_t len = (total number of bytes to be written out);

while (len > 0)
{
    ssize_t written = write(sockfd, buf, len);
    if (written < 0)
    {
        /* now THAT is an error */
        break;
    }
    len -= written;
    buf += written; /* tricky pointer arythmetic */
}
int readbytes = 0;
char buf[512];
do {
    readbytes = read(sockfd, buf, 512);
    if (readbytes < 0)
    {
        /* error */
        break;
    }
    if (readbytes > 0)
    {
        /* process your freshly read data chunk */
    }
} while (readbytes > 0); /* until EOF */