C++ 从ubuntu上的tftp服务器下载(boost::asio c+;+;)

C++ 从ubuntu上的tftp服务器下载(boost::asio c+;+;),c++,linux,udp,boost-asio,tftp,C++,Linux,Udp,Boost Asio,Tftp,我正在寻找一个在Linux平台上运行的TFTP客户机示例。我正在尝试使用boost::asio解决此问题,代码如下: void packi16 (char *buf, unsigned short int i){ //change the host order to network byte order (16bit) i = htons(i); memcpy(buf,&i,2); } int main() { boost::asio::io_service service; bo

我正在寻找一个在Linux平台上运行的TFTP客户机示例。我正在尝试使用boost::asio解决此问题,代码如下:

void packi16 (char *buf, unsigned short int i){   //change the host order to network byte order (16bit)
i = htons(i);
memcpy(buf,&i,2);
}

int main()
{
boost::asio::io_service service;
boost::asio::ip::udp::socket sock(service);
sock.open(boost::asio::ip::udp::v4());
boost::asio::ip::udp::endpoint receiver_ep(boost::asio::ip::address::from_string("127.0.0.1"), 69);
char filename[] = "first";
char mode[] = "netascii";
int filename_size = (sizeof(filename)/sizeof(*filename));
int mode_size = (sizeof(mode)/sizeof(*mode));
char *packet;
packet = (char *)malloc((17)*sizeof(char));
packi16(packet,1); // 1 opcode for read request
memcpy(packet+2,filename,filename_size-1);
memset(packet+1+filename_size, '\0', 1);
memcpy(packet+2+filename_size, mode, mode_size-1);
memset(packet+1+filename_size+mode_size, '\0', 1);
sock.send_to(boost::asio::buffer(packet, 17), receiver_ep);
char buff[512];
boost::asio::ip::udp::endpoint sender_ep;
sock.receive_from(boost::asio::buffer(buff), sender_ep);
std::cout << buff;
return 0;
}
void packi16(char*buf,unsigned short int i){//将主机顺序更改为网络字节顺序(16位)
i=htons(i);
memcpy(buf和i,2);
}
int main()
{
boost::asio::io_服务;
boost::asio::ip::udp::socket sock(服务);
open(boost::asio::ip::udp::v4());
boost::asio::ip::udp::endpoint receiver_ep(boost::asio::ip::address::from_string(“127.0.0.1”),69);
字符文件名[]=“第一”;
字符模式[]=“netascii”;
int filename_size=(sizeof(filename)/sizeof(*filename));
int mode_size=(sizeof(mode)/sizeof(*mode));
字符*数据包;
数据包=(字符*)malloc((17)*sizeof(字符));
packi16(数据包,1);//读取请求的1操作码
memcpy(数据包+2,文件名,文件名大小-1);
memset(数据包+1+文件名\u大小,'\0',1);
memcpy(数据包+2+文件名\u大小、模式、模式\u大小-1);
memset(数据包+1+文件名大小+模式大小,'\0',1);
发送到(boost::asio::buffer(数据包,17),接收方);
字符buff[512];
boost::asio::ip::udp::端点发送器\u ep;
sock.receive_from(boost::asio::buffer(buff),sender_ep);

std::cout如果你想实现TFTP客户端,你需要发送而不是获取请求。你也可以看看这个。为什么会有像GET like请求这样的请求?它不应该是
读取请求
?缓冲区应该包含-
操作码
源文件
文件类型