使用recv()确定数据包大小的最佳方法是什么?

问题描述 投票:0回答:1

对于套接字编程和C语言来说,这是非常新的。我正在尝试编写一个基本程序来在两台计算机之间发送和接收数据。我知道recv不会一次获取所有数据-实际上,您必须循环访问它,直到它读取了整个消息为止。

代替仅在两台计算机上设置限制,我在客户端创建了一个简单的Message结构:

struct Message {
    size_t length;
    char contents[1024 - sizeof(size_t)];
} message; 
message.length = sizeof(struct Message);
message.contents = information_i_want_to_send;

[当到达服务器时,我将recv读入缓冲区:received = recv(ioSock, &buffer, 1024, 0)(巧合的是,它与我的Message结构的大小相同,但假设不是...)。

然后我像这样从缓冲区中提取Message.length

size_t messagelength;
messagelength = *((size_t *) &buffer);

然后我在recv时将received < messagelength循环到缓冲区。这行得通,但是我不禁觉得它真的很丑,而且感觉很笨拙。 (特别是如果第一个recv调用读取的数据少于sizeof(size_t)或计算机使用不同的位体系结构,则在这种情况下,size_t强制转换将不起作用。)有更好的方法吗?

c sockets send recv
1个回答
0
投票

有两种方法可以做到...

1。)使用二进制同步协议。 (使用STX-文本开始和ETX-文本结束)来标识文本的开始和结束。

2。)在数据开头附加要发送的数据字节数。套接字将读取这些字节数,并将获取要从套接字接收的字节数。然后读取所有数据并获取所需的数据量。

嗯...似乎很难... ??让我举一个例子。

需要发送的实际数据:ABCDEFGHIJ

新数据格式:0010ABCDEFGHIJ

服务器端所需的数据:ABCDE

recv函数将读取前4个字节以获取实际数据的字节数(循环直到获得4个字节):

int received1= recv(ioSock, recvbuf, 4, 0);

根据上述情况,'recvbuf'将被0010转换为整数,将得到的值为'10',该值可以存储在某些整数变量中。所以我们有:

int toReadVal = 10

现在我们需要的是在下一个recv调用中读取这10位数字:

int received= recv(ioSock, recvbuf1, toReadVal, 0);

最后,我们将recvbuf1的值为ABCDEFGHIG。现在,您可以根据需要截断该值。

© www.soinside.com 2019 - 2024. All rights reserved.