在winsock2中发送其他数据types

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

你需要传递给send()函数的const char *buf只是一个指向字节数组的指针。 您需要将整数转换为字节:

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

只需将该值存储到变量中,然后键入将该变量转换为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可能是一个有用的类来创建字符串和解析它的另一端。