hg_*_*git 0 c c++ sockets linux 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);
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我们使用char类型,但是我们仅限于char类型,因为send/write/sendto通常采用void *类型.我也看到了一些参数,比如我们发送一些int,它实际上可能存储在little endian/big endian中,如果它们的endianess不匹配,会导致b/w source/dest出现问题.那么为什么不char输入这个问题呢?
另外C和C++等不同的语言也有不同的大小char,为什么这不是一个问题呢?如果socket不关心任何type内容并且只是将内容视为缓冲区,那么当不同的tcp服务器/客户端用不同的语言编写并相互通信时,为什么我们不会看到数据的随机损坏?
简而言之,我可以通过套接字安全地发送什么值(类型)?
小智 5
您无法通过原始套接字安全地发送任何内容,并希望接收器能够理解它.例如,发送过程可能位于字符编码为EBCDIC的计算机上,接收过程可能位于字符编码为ASCII的计算机上.这取决于协商协议以对其进行排序,或简单地在其规范中说"我们正在使用ASCII(或其他)"的过程.
一旦你完成了字符编码,在文本中传输数据是我的建议.这样可以避免所有字节序问题,并且更易于调试和记录.