c - 通过套接字发送整数和字符

标签 c sockets

我正在为一个使用套接字的应用程序编写代码,我必须在其中通过网络发送整数和字符串,但我无法将数据打包到缓冲区中进行传输。我试过这样做:

sendline[0] = htons(3);
sendline[1] = htons(strlen(argv[3]));
for(int i = 0; i < strlen(argv[3]); i++)
{
    sendline[i + 2] = argv[3][i];
}
sendline[2 + strlen(argv[3])] = htons(atoi(argv[4]));
sendline[3 + strlen(argv[3])] = '\0';

但它不起作用。 我哪里错了?另外,序列化此类数据的最佳方法是什么?

这是我的反序列化代码:

case '3': // switching on the value of buf[0]
{
    int i;
    int len = ntohs(buf[1]);
    char* ch = (char*)malloc(len * sizeof(char));
    for(i = 0; i < len; i++)
    {
        ch[i] = buf[i + 2];
    }
}

最佳答案

如果您要序列化 ​​32 位(4 字节)整数,您应该使用 htonl()ntohl()

发送:

int my_integer = INT32_MAX;
uint32_t data = htonl(my_integer);
write(s, &data, sizeof(data));

接收:

uint32_t data;
read(s, &data, sizeof(data));
int my_integer = ntohl(data);

关于 SO 的许多问题已经描述了序列化和 htonl()/ntohl() 函数,但要注意那些省略字节顺序的问题。请记住检查 read()write() 的返回值。

至于“字符串”,如果它们是描述 ASCII 文本的 char 数据,则不要将它们序列化。 UTF8 也可以在没有序列化的情况下工作,但要注意 UTF-16。尽早掌握字节顺序的重要一点是它指的是字节顺序,而不是字节中位的顺序。 IIRC C保证了单字节的表现形式,所以在所有C平台上表现都是一样的。

关于c - 通过套接字发送整数和字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22553272/

相关文章:

node.js - 如何在 node.js http 模块超时时发送响应

c - fscanf() != EOF 作为循环的退出条件在错误的时间退出

使用定时器处理 C 信号

c - 嵌套循环、内循环并行化、重用线程

java - 当我关闭程序时端口如何关闭

Python:设置多个连续超时

javascript - NodeJS 套接字发出返回未定义

c - 程序可以工作,但输出尾随垃圾值

javascript - 通过C将数据从JavaScript发送到Mongodb

javascript - 使用 Rails 的基于 Web 的 IP 语音应用程序