2012-01-28 63 views
4

可能是解决这两个函数之间的任何差异?:
对于这个问题带来了另一个问题......是字符数总是与字节数相同?
欲了解更多信息:我用它在Linux上的TCP套接字通信(sys/socket.h) 感谢您的回应。write()和send()解决错误=>差异?

send()
write()

返回:
写():
成功时,写入返回的字节数(零表示没有写)。出错时,返回-1,并且适当地设置errno。如果count为零且文件描述符引用常规文件,则将返回0而不会导致任何其他影响。对于特殊文件,结果不可移植。

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

来自stackoverflow的问题,说这种方法应该与使用标志零相同。
here

int client_sockfd; 
char* msg; 
int length = strlen(msg); 

//first option 
if(send(client_sockfd, msg, length, 0) != length) return 1; 
else return 0; 
//second option 
if(write(client_sockfd, msg, length) != length) return 1; 
else return 0; 

回答

3

他们都将返回相同数量的写入的字节(==字符在这种情况下,除了注意这一点:

如果消息太长通过底层协议原子通过,所述 误差EMSGSIZE返回,并且不发送消息。

换句话说,取决于数据的大小被写入,写()可以成功,而发送()可能会失败。

1

字节数==字符数,因为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 */ 
} 

read(): 亦如这里,与EOF通过返回0指示的唯一差别,这是不是错误。同样,如果您想从套接字接收所有可用数据,则必须重试读取。

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 */ 

你可以看到我的实现使用这种技术的一个简单的TCP辅助类的https://github.com/H2CO3/TCPHelper/blob/master/TCPHelper.m

+0

权,规则的改变,如果套接字是非阻塞的。 – 2012-01-28 22:07:45

+0

但是TCP在阻塞模式下处于默认状态?所以我不应该这样复杂?在这种情况下 .. – user1097772 2012-01-28 22:19:21