winsock2中的send函数只接受char指针。 如何通过它发送整数或对象?
答案 0 :(得分: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);
并且复杂对象需要serialized来传输字节。
注1:如果服务器和客户端使用相同的平台(x32 / x64 / ...),则代码示例有效,这意味着int
具有相同的字节数且字节顺序相同。< / p>
注2:编写代码应检查每一步都没有缓冲区(MAX_BUF_SIZE
)溢出。
答案 1 :(得分:2)
只需将值存储到变量中,然后将变量输入到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);
答案 2 :(得分:0)
通常,最简单的方法是将整数或对象打印到字符串,然后发送该字符串。文本表示更便携,也更容易调试。
std::stringstream
可能是创建字符串并在另一端解析它的有用类。