1

winsock2 中的 send 函数只接受 char 指针。我如何也通过它发送整数或对象?

4

3 回答 3

5

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);

复杂的对象需要序列化为字节流。

注意 1:如果服务器和客户端都使用相同的平台 (x32 / x64 / ...),则代码示例有效,这意味着int具有相同的字节数并且字节顺序相同。

注 2:编写代码应检查每一步是否存在缓冲区 ( MAX_BUF_SIZE) 溢出。

于 2011-08-22T08:53:24.267 回答
2

只需将值存储到变量中,然后将变量类型转换为char*. send()and函数对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);
于 2011-08-22T23:28:18.263 回答
0

通常,最简单的方法是将整数或对象打印到字符串中,然后发送该字符串。文本表示更便携,也更容易调试。

std::stringstream可能是一个有用的类,既可以创建字符串,也可以在另一端解析它。

于 2011-08-22T09:49:39.897 回答