繁体   English   中英

在winsock2中发送其他数据类型

[英]Send other data types in winsock2

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

您需要将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 )溢出。

只需将值存储到变量中,然后将变量类型转换为char* 尽管采用了char*参数, send()recv()函数仍对二进制数据进行操作。

正在发送:

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可能是一个有用的类,可用于创建字符串并在另一端对其进行解析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM