在winsock2中发送其他数据类型

发布于 2024-11-30 12:25:23 字数 44 浏览 1 评论 0原文

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

The send function in winsock2 accepts only char pointers.
How do I send integers or objects through it too?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

姜生凉生 2024-12-07 12:25:23

您需要作为参数传递给 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) 溢出。

const char *buf which you need to pass to send() function as an argument is just a pointer to array of bytes. You need to convert integers to bytes:

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

and reading code:

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

and complex objects needs to be serialized to stream of bytes.

Note 1: The code sample is valid iff both server and client use the same platforms (x32 / x64 / ...) that means int has the same amount of bytes and byte order is the same.

Note 2: Writing code should check that there is no buffer (MAX_BUF_SIZE) overflow on each step.

苍暮颜 2024-12-07 12:25:23

只需将值存储到变量中,然后将变量类型转换为 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);

Just store the value into a variable and then type-cast the variable to char*. The send() and recv() functions operate on binary data, despite taking char* parameters.

Sending:

int int_data = 4;
send(sock, (char*) &int_data, sizeof(int), 0);

Reading:

int int_data;
recv(sock, (char*) &int_data, sizeof(int), 0);
陌若浮生 2024-12-07 12:25:23

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

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

Generally, the easiest way is to print the integer or object to a string, and send that string. Textual representations are more portable, and also easier to debug.

std::stringstream may be a useful class both to create the string and parse it on the other end.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文