【发布时间】:2011-10-31 23:30:26
【问题描述】:
winsock2 中的发送函数只接受字符指针。 我如何也通过它发送整数或对象?
【问题讨论】:
winsock2 中的发送函数只接受字符指针。 我如何也通过它发送整数或对象?
【问题讨论】:
const char *buf 您需要作为参数传递给send() 函数只是一个指向字节数组的指针。您需要将整数转换为字节:
const int MAX_BUF_SIZE = 1024;
int int_data = 4;
const char *str_data = "test";
char *buf = (char*) malloc(MAX_BUF_SIZE);
char *p = buf;
memcpy(&int_data, p, sizeof(int_data));
p += sizeof(int_data);
strcpy(p, str_data);
p += strlen(str_data) + 1;
send(sock, buf, p - buf, 0);
free(buf);
和阅读代码:
const int MAX_BUF_SIZE = 1024;
int int_data = 0;
const char *str_data = NULL;
char *buf = (char*) malloc(MAX_BUF_SIZE);
char *p = buf;
recv(sock, buf, MAX_BUF_SIZE, 0);
memcpy(p, &int_data, sizeof(int_data));
p += sizeof(int_data);
str_data = malloc(strlen(p) + 1);
strcpy(str_data, p);
p += strlen(p) + 1;
free(buf);
而复杂对象需要serialized 才能成为字节流。
注意 1:如果服务器和客户端都使用相同的平台 (x32 / x64 / ...),则代码示例有效,这意味着 int 具有相同的字节数并且字节顺序相同。
注意 2:编写代码应检查每一步是否存在缓冲区 (MAX_BUF_SIZE) 溢出。
【讨论】:
htons 和htonl()。 (@Pilpel:“hton”代表“Host TO Network”;它更改字节顺序以匹配 TCP/IP 的顺序。接收时,您将使用“ntoh”函数。两者都存在于 's' 中(简称, 16 bits) 和 'l' (long, 32 bits) 版本。
reinterpret_cast<char*>(&result_of_htonl)之前需要做的步骤
只需将值存储到变量中,然后将变量类型转换为char*。 send() 和 recv() 函数对二进制数据进行操作,尽管采用 char* 参数。
发送:
int int_data = 4;
send(sock, (char*) &int_data, sizeof(int), 0);
阅读:
int int_data;
recv(sock, (char*) &int_data, sizeof(int), 0);
【讨论】:
通常,最简单的方法是将整数或对象打印到字符串中,然后发送该字符串。文本表示更便携,也更容易调试。
std::stringstream 可能是一个有用的类,既可以创建字符串,也可以在另一端解析它。
【讨论】: