【发布时间】:2012-02-26 18:54:33
【问题描述】:
我正在处理一个客户端-服务器项目,需要实现一个逻辑,在我继续之前,我需要检查我是否通过 TCP 套接字连接接收到最后一个数据。 为了确保我收到了所有数据,我打算在发送的最后一个数据包中添加一个标志。我有两个选项,如下所示,还有相关的问题。
我。使用如下结构并为发送的最后一个数据包填充 vst_pad,并在 recv 端检查它是否存在。与选项二相比的优点是,在将其写入文件之前,我不必从实际数据中删除标志。只需检查结构的第一个成员
typedef struct
{
/* String holding padding for last packet when socket is changed */
char vst_pad[10];
/* Pointer to data being transmitted */
char *vst_data;
//unsigned char vst_data[1];
} st_packetData;
问题是我必须在每次发送调用时序列化结构。此外,我不确定是否会在一次 recv 调用中通过 TCP 接收整个结构,因此每次都必须添加逻辑/开销来检查这一点。到目前为止我已经实现了这一点,但后来发现基于流的 TCP 可能不能保证在一次调用中接收整个结构。
二。使用 strncat 之类的函数将该标志添加到最后发送的数据的末尾。
问题是我必须使用正则表达式函数或类似 strstr 的函数检查每个接收调用是否存在该标志,如果存在则必须将其从数据中删除。
此应用程序将用于大数据传输,因此希望在每个发送/接收/读取/写入调用上增加最小的开销。真的很想知道是否有比上述两个更好的选项或任何其他选项来检查最后一个数据包的接收。该程序是多线程的。
编辑:我不知道要发送的文件的总大小,但我正在发送固定数量的数据。那就是 fgets 读取直到指定的大小 -1 或直到遇到新行。
【问题讨论】:
标签: c networking tcp padding