繁体   English   中英

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

[英]What is the data type of content sent over socket?

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

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

在此代码中,我们使用的是char类型,但是由于send / write / sendto通常采用void *类型,因此我们仅限于char类型。 我也看到过类似的论据,例如如果我们发送一些int值,它实际上可能存储在little endian / big endian中,如果它们的字节序不匹配,则可能会在源/目标上造成问题。 那么为什么char类型也不会遭受这个问题呢?

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

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

您无法通过原始套接字安全地发送任何内容,并且期望接收​​者理解它。 例如,发送过程可能在字符编码为EBCDIC的机器上,而接收过程可能在字符编码为ASCII的机器上。 决定协商协议以解决该问题的流程,还是在其规范中简单地说“我们正在使用ASCII(或其他任何方式)”。

一旦确定了字符编码,我建议您以文本形式传输数据。 这样可以避免所有字节序问题,并且更易于调试和记录。

最简单的答案是数据是八位字节的未解释流,即8位字节。 发送方和接收方都可以进行任何形式的内化,他们会更好地达成共识。 您当然需要同时考虑整数的大小和字节序,并且还要考虑编译器的对齐方式和填充规则。 例如,这就是为什么您不应该将C结构用作网络协议的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM