通过套接字发送的内容的数据类型是什么?

时间:2017-03-04 23:23:00

标签: c++ c linux sockets networking

使用Berkeley套接字api时,通过read / send或write / recv调用发送的内容的数据类型是什么?例如 -

char *msg = "Our Message!";
int len, bytes_sent;
len = strlen(msg);
bytes_sent = send(sockfd, msg, len, 0);

在这段代码中,我们使用的是char类型,但是我们只限于char类型,因为send / write / sendto通常采用void *类型。我也看到了一些论据,比如我们发送一些int,它实际上可能存储在little endian / big endian中,如果它们的endianess不匹配,会导致b / w source / dest出现问题。那么为什么char类型也不会遇到这个问题呢?

C和C ++等不同的语言也有不同的char大小,那么为什么这不是一个问题呢?如果socket不关心任何type并只看到内容为缓冲区,为什么当不同的tcp服务器/客户端用不同的语言编写并相互通信时,我们不会看到数据的随机损坏?

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

2 个答案:

答案 0 :(得分:5)

您无法通过原始套接字安全地发送任何内容,并希望接收器能够理解它。例如,发送过程可能位于字符编码为EBCDIC的计算机上,接收过程可能位于字符编码为ASCII的计算机上。它可以通过协商协议来解决这个问题,也可以简单地说出他们的规范"我们正在使用ASCII(或其他)"。

一旦你完成了字符编码,就可以在文本中传输数据。这样可以避免所有的endian问题,并且更容易调试和记录。

答案 1 :(得分:4)

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