正在添加自定义邮件头
Adding custom message header
有人能告诉我:"如何构造标头?"我正在编写FTP客户端-服务器代码。我想在客户端为我必须发送到服务器的所有数据包添加一个Header,其中包含我的数据大小等信息。
我在SO见过一些例子,但不知道具体的方法。任何指向示例/示例代码的指针都将受到赞赏。
查看scapy,一个用于构建数据包的库。我认为这正是你所需要的。
建立协议数据的最佳方法是在某个地方有一个uint8_t
缓冲区,并按照协议中的指定填充它。
对于FTP本身,这相当简单,因为控制连接中只有ASCII字符串。像这样的东西可能会起作用:
bool append_literal(uint8_t **cursor, uint8_t *end, uint8_t const *data, size_t size) {
assert(cursor);
assert(*cursor);
assert(end);
assert(*cursor < end);
assert(data);
if((end - *cursor) < size) // Check buffer limit
return false;
memcpy(*cursor, data, size); // Copy
*cursor += size; // Increment cursor
return true;
}
bool append_number(uint8_t **cursor, uint8_t *end, uint64_t number) {
assert(cursor);
assert(*cursor);
assert(end);
assert(*cursor < end);
if((end - *cursor) < 17) // Max number of base 10 digits in uint64_t
return false;
*cursor += sprintf(*cursor, "%" PRIu64, number);
return true;
}
bool append_uint32_binary(uint8_t **cursor, uint8_t *end, uint32_t value) {
assert(cursor);
assert(*cursor);
assert(end);
assert(*cursor < end);
if((end - *cursor) < 4) // Bytes needed for uint32 value
return false;
*(*cursor)++ = (value >> 24) & 0xff;
*(*cursor)++ = (value >> 16) & 0xff;
*(*cursor)++ = (value >> 8) & 0xff;
*(*cursor)++ = value & 0xff;
return true;
}
// Specific FTP commands
bool append_size_command(uint8_t **cursor, uint8_t *end, uint64_t size) {
return append_literal(cursor, end, "SIZE ", 5) &&
append_number(cursor, end, size) &&
append_literal(cursor, end, "rn", 2);
}
// [...]
bool send_size_command(int fd, uint64_t size) {
uint8_t buffer[32];
uint8_t *cursor = buffer;
uint8_t *const end = buffer + sizeof buffer;
if(!append_size_command(&cursor, end, size))
return false;
size_t length = cursor - buffer;
ssize_t sent = send(fd, buffer, length, 0);
return (sent == length);
}
如果程序编写正确,即指针有效,那么"assert"语句测试的内容将始终为true。任何函数在成功时返回true
,如果失败则返回false
。
我已经为套接字使用了标准的POSIX函数,因为WinSock实现了这些函数,而且它们是相当可移植的。
您的作业是找到PRIu64
需要包含的标题:)
在两个客户端服务器的Header中定义一个成员结构(最好在两者中都包含一个结构的Header文件)。在原始消息之前发送标题。服务器上具有结构的固定长度参数的recv。
typedef struct
{
DWORD dwMsgType ;
DWORD dwMsgSize ;
}MSG_HEADER, *PMSG_HEADER ;
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- TraciMobility::getExternalId 将自定义模块添加到示例中时出错Veins_Inet (Omne
- 如何在自定义对象的<<运算符中添加自定义前缀
- 如何在Qt C++中向自定义控件添加属性?
- 将自定义样式添加到 QTableview 中添加的按钮
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 如何添加自定义关键字以 clang 格式被视为"class"?
- 向 std::map 添加对象和自定义比较<>
- 如何将自定义角色添加到 QFileSystemModel
- 为C /CLI中的所有请求添加自定义的标头到WebBrowser控件
- 将自定义代码添加到Swig包装器中
- 如何使用 word 对象模型中的C++接口在 word 中添加自定义 XML 艺术
- 如何将比较器添加到自定义排序函数
- 如何在Boost Graph库中的Grid_graph的边缘添加自定义属性
- 当我添加自定义比较器时,无法插入新元素以设置
- 我们如何添加Coverity工具的自定义规则
- Visual Studio Code 中的自定义库添加
- 如何在Tensorflow Lite中添加自定义运算符
- MFC 自定义 - 添加新工具栏