- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
通过 UDP 套接字实现 TFTP 客户端。首先,我创建 UDP 非阻塞套接字并执行 PUT/GET 操作,它工作正常。但是,当我再次尝试执行 GET/PUT 时,它不起作用。 RRQ/WRQ 请求本身未到达服务器,但已从客户端成功发送。下面是我的 tftp 客户端代码。
============================================= ==========
int sockfd;
struct sockaddr_in serv_addr;
//called when we retrieve a file from the server
void getFile(int port, char *filename)
{
printf("enter to get file\n");
FILE * file;
if (strchr(filename,'/') != NULL )
{
printf("We do not support file transfer out of the current working directory\n");
return;
}
file = fopen(filename, "wb");
if(file == NULL)
{
perror(filename);
return;
}
if(sockfd < 0)
{
printf("Couldn't open socket\n");
return;
}
if(!send_RRQ(sockfd, (struct sockaddr *) &serv_addr, filename, TFTP_SUPORTED_MODE))
{
printf("Error: couldn't send RRQ\n");
return;
}
if(!recvFile(sockfd, (struct sockaddr *) &serv_addr, file,filename))
{
printf("Error: didn't receive file\n");
return;
}
fclose(file);
return;
}
//used to upload files to the server
void putFile(int port, char *filename)
{
printf("filenemae is: %s \t",filename);
PACKET packet;
int result;
FILE * fileh;
int timeout_counter = 0;
if (strchr(filename,'/') != NULL )
{
printf("We do not support file transfer out of the current working directory\n");
return;
}
fileh = fopen(filename, "rb");
if(fileh == NULL)
{
perror(filename);
return;
}
if(!send_WRQ(sockfd, (struct sockaddr *) &serv_addr, filename, TFTP_SUPORTED_MODE))
{
printf("Error: couldn't send WRQ to server\n");
return;
}
while (timeout_counter < MAX_TFTP_TIMEOUTS)
{
result = waitForPacket(sockfd, (struct sockaddr *) &serv_addr, TFTP_OPTCODE_ACK, &packet);
if (result < 0)
{
printf("Error: Timeout sending packet to server\n");
if(!send_WRQ(sockfd, (struct sockaddr *) &serv_addr, filename, TFTP_SUPORTED_MODE))
{
printf("Error: couldn't send WRQ to server\n");
return;
}
timeout_counter++;
}else
{
break;
}
}
if (result < 0)
{
//we still timed out
printf("Timed out after %d tries, is the server running\n",MAX_TFTP_TIMEOUTS);
fclose(fileh);
return;
}
if (packet.optcode == TFTP_OPTCODE_ERR)
{
//we recieved an error, print it
printError(&packet);
}else
{
if (!sendFile(sockfd, (struct sockaddr *) &serv_addr, fileh))
{
printf("Unable to send file to server\n");
}
}
fclose(fileh);
return;
}
int createUDPSocketAndBind(int port)
{
//create a socket
sockfd = socket(PF_INET, SOCK_DGRAM, 0);
//return -1 on error
if (sockfd == -1)
{
return -1;
}
//zero out the struct
bzero((char*) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(port);
return 0;
}
//main client, checks for args and starts an operation if no errors detected
int main(int argc, char *argv[])
{
int port = 59;
int argOffset = 1;
char* filename;
char fme[] = "test.txt";
createUDPSocketAndBind(port);
printf("for put file\n");
putFile(port,fme); //=====> this operation is successful.
//createUDPSocketAndBind(port); //=====> If I uncomment this function, next operation works.
printf("for getfile\n");
getFile(port,fme); //=======> It is failing.
printf("Usage: %s [-p port] (-w putfile || -r getFile)\n",argv[0]);
}
=========================================================================
最佳答案
我进行了更多调查,发现我的代码和解决方案也存在问题。
当您向服务器发送第一个 RD/WR 请求时,它会创建一个单独的进程或线程来处理您的请求,同时它会创建新的套接字并使用不同的端口号来处理请求RD/WR 请求。
当您使用以下 UDP 套接字 API 从服务器接收响应时,客户端。
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 结构 sockaddr *src_addr, socklen_t *addrlen);
在“struct sockaddr *src_addr”实例中,端口号将随着服务器使用不同的端口号进行响应而更新已创建以处理您的请求,您的 RD/WR 操作将使用此端口号成功完成。
一旦 RD/WR 成功完成,服务器将关闭为处理您的请求而创建的套接字并开始监听您的新请求在原始端口上。但客户端“struct sockaddr *src_addr”实例仍将具有修改后的端口号,当您尝试发送新的 RD/WR 请求时,它不会到达服务器。这就是第二个 RD/WR 请求不会到达服务器并且会失败的原因。
要在客户端的“struct sockaddr *src_addr”实例中修复此问题,您必须将端口重置为初始值,该值最初用于配置“struct sockaddr *src_addr”的服务器实例。所以在每次 RD/WR 操作后你必须重新设置端口号为原始值。
我对 UDP 套接字很陌生,这对我来说是很好的学习。我认为这对像我这样的初学者会有帮助。
谢谢
关于linux - 第一次在 TFTP 客户端成功完成 GET/PUT 操作后,第二次 TFTP PUT 操作不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41570302/
我正在尝试用 C 语言(Windows、Visual Studio 2005)实现 TFTP 客户端。 TFTP 客户端应该连接到端口 69 上的远程 TFTP 服务器地址。 TFTP 客户端正在使用
通过 UDP 套接字实现 TFTP 客户端。首先,我创建 UDP 非阻塞套接字并执行 PUT/GET 操作,它工作正常。但是,当我再次尝试执行 GET/PUT 时,它不起作用。 RRQ/WRQ 请求本
我编写了一个简单的 tftp 服务器,它仅处理来自客户端的读取请求 (RRQ)。问题是服务器似乎没有向客户端发送数据包。我通过检查发送字节的长度与数据包大小来确保服务器没有发送数据包。 注意:我使用l
我正在使用 C++ 开发 TFTP 服务器。问题是当我使用可通过 Internet 获得的 TFTP 客户端演示 (HS TFTP) 时,我无法接收或至少在接收缓冲区中看不到任何内容。 我可以“感觉到
谁能告诉我理想的多线程 C++ TFTP 应用程序的源代码。如果它是使用 boost asio 编写的,那就更好了。 只是想了解如何使用 UDP 而不是 TCP 构建多线程 C++ 网络应用程序。 我
我需要在下载后解析文本文件流,而不使用 tftp 协议(protocol)将文本文件保存到硬盘或 sdcard。我有有效载荷中的数据。请帮忙。 struct pbuf { struct pbu
我编写了一个简单的 TFTP 服务器,它只处理读取请求 (RRQ),并且工作正常。如果在 5 秒内没有收到 ACK,服务器应该再次重新传输当前数据包。服务器还应该在放弃之前重新传输数据包 3 次。我试
我正在寻找一种使用 tftp 命令集的实现,它可以从远程服务器获取数据,但不是完全获取整个数据,而是在大小小于远程文件大小的本地环形缓冲区中获取数据,并在环被循环后覆盖数据。因此,如果任何进程在数据可
我将以下代码放在一起用于一个简单的 Ruby TFTP 服务器。它工作正常,因为它监听端口 69 并且我的 TFTP 客户端连接到它,我能够将数据包写入 test.txt,但我不只是写入数据包,我希望
维基百科 TFTP状态: Windows 2008 introduced pipelined TFTP 其目标是在高延迟链路上实现良好的吞吐量。不幸的是没有给出引用。我找到的唯一其他引用是 Bazoo
很长一段时间以来,我一直在努力在 Android 应用程序中处理 TFTP 协议(protocol)。其主要功能是从托管 TFTP 服务器的定制设计设备下载文件。 我正在浏览互联网,希望找到一些好的、
多次迭代上传文件时是否需要每次都建立连接以维持堆栈大小? 我收到 calloc 失败错误。 我正在使用带有多线程的 freertos。 最佳答案 根据Wikipedia是的,TFTP 不允许为多个文件
我创建了一个简单的 tftp 服务器,仅处理读取请求 (RRQ)。一切都工作正常,直到我开始制作服务器的多线程版本。在应用程序中,我只是在主线程中接收请求,然后将请求转发到执行数据包分析的新线程。因此
我正在编写自己的 TFTP 客户端。客户端是用 c++(部分是 c)编写的,并在 unix 系统(Linux Debian 稳定版)上运行。 这是我的问题: 我可以将我的读取请求 (RRQ) 发送到
我有 BusyBox v1.23.2 多调用二进制文件。 带有简单的 tftp 客户端。我需要检查与 tftp 服务器的连接以及那里文件的可访问性。对于 ftp,它可能如下所示: if wget -q
我正致力于实现 TFTP 客户端(UDP 套接字)。 目前我必须关闭我的 Windows 8 机器上的整个防火墙,否则数据无法到达 TFTP 客户端。传出连接请求发生在端口 69 上,但来自 TFTP
我还是个学生,所以我可能漏掉了一些非常明显的东西。 所以我为此非常紧张。 但无论如何,这是我的 TFTP python 代码,它所做的只是从我们讲师的服务器下载一个文本文件。 它生成的文件如下所示:
我正在使用 tftp 使用 Windows 10 上的 ubuntu 子系统将文件上传到我的电脑上的 tftp 服务器。 当我输入这样的命令时: tftp -m binary 192.168.1.16
我有一个 C 代码库,可以解析网络数据包,它似乎可以很好地处理 UDP。 TFTP(的第一个数据包)除外。 Ubuntu tftp 客户端(实际上是 BSD netkit TFTP 客户端)在这方面有
我正在用 C 语言编写一个 tftp 服务器,并在终端上使用 tftp 命令对其进行测试。然而,大多数时候,当我尝试发送 RRQ 时,我会收到类似以下内容的信息: tftp> get a.txt se
我是一名优秀的程序员,十分优秀!