2017-03-04 61 views
0

当使用伯克利套接字api时,通过读取/发送或写入/接收呼叫发送的内容的数据类型是什么?例如 -什么是通过套接字发送的内容的数据类型?

char *msg = "Our Message!"; 
int len, bytes_sent; 
len = strlen(msg); 
bytes_sent = send(sockfd, msg, len, 0); 
在这段代码

,我们使用的是char类型,但我们只限于char类型,因为发送/写/ SENDTO通常采取void *类型。我也看到过,如果我们发送一些int,它可能实际上存储在小端/大端,如果它们的端点不匹配,会导致问题b/w源/目标。那么为什么char类型也遭受这个问题呢?

另外像C和C++这样的不同语言也有不同的大小char,那为什么这不是问题呢?如果套接字不关心任何type,只是将内容视为缓冲区,为什么我们不看到随不同tcp服务器/客户机使用不同语言编写并相互通信时的数据随机损坏?

总之,可以通过套接字安全地发送什么值(类型)?

+0

“不同的语言像C和C++有不同的字符大小”不,在C和C++中,字符的大小都是1. –

+0

@NeilButterworth哦所以字面'a'的大小必须是4 = –

+0

最安全的方法是发送一个字节缓冲区,'char'总是1个字节。所有为此设计的语言都有这样的数据类型。 – DeiDei

回答

4

您无法通过原始套接字安全地发送任何内容,并期望接收方理解它。例如,发送过程可能位于字符编码为EBCDIC的计算机上,接收过程可能位于字符编码为ASCII的计算机上。这需要通过协商协议来解决这个问题,或者只是在他们的规范中说“我们正在使用ASCII码(或其他)”。

一旦你得到了编码的字符编码,传输文本中的数据是我的建议。这避免了所有endian问题,并且更容易调试和记录。

4

最简单的答案是数据是一个未经解释的八位字节流,也就是说8位字节。它的任何表述都由发送者和接收者完成,他们更好地同意。您当然需要考虑整数的大小和字节顺序,以及编译器对齐和填充规则。这就是为什么例如你不应该使用C结构作为网络协议。