• 大小: 1KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-20
  • 语言: 其他
  • 标签: 实现  

资源简介

基于linux c udp网络编程实现的客户端 TFTP文件上传/下载,可以与官方的tftp服务器实现良好传输

资源截图

代码片段和文件信息

#include //
#include //
#include //
#include //
#include 
#include //
#include 
#include 
#include 
#include 
#include //
#include //
#include 

int main(int argc char const *argv[])
{
int socketfd = 0;
int fd = 0;
socklen_t addr_len = 0;
socklen_t len = 0; 
unsigned short server_port = 69;
struct sockaddr_in s_addr;
//struct sockaddr_in c_addr;
char sendbuf[516];
char recvbuf[516];
char ack[5];
char *filename = argv[3];
if ((socketfd = socket(AF_INETSOCK_DGRAM0)) < 0)
{
perror(“socket“);
exit(EXIT_FAILURE);
}
else
{
printf(“creat socket.\n“);
}
memset(&s_addr0 sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(server_port);
//s_addr.sin_addr.s_addr = INADDR_ANY;//ip

/*if ((bind(socketfd(struct sockaddr *) &s_addr sizeof(s_addr)))==-1)
{
perror(“bind“);
exit(EXIT_FAILURE);
}
printf(“bind to socket\n“);
addr_len = sizeof(c_addr);
*/
if (inet_aton (argv[1]&s_addr.sin_addr) == 0)
{
perror(“argv[1]“);
exit(EXIT_FAILURE);
}
memset(sendbuf0 sizeof(sendbuf));
if (strcmp (argv[2]“get“) == 0)//发送读请求
{
len = sprintf (sendbuf “%c%c%s%cnetascii%c“ 0 1 filename 0 0);//操作码01/文件名/0/netascii/0
if ((sendto(socketfd sendbuf len 0 (struct sockaddr *) &s_addrsizeof (s_addr))) < 0)//套字/数据缓存/数据长度/0/目的网络地址/地址长度
{
printf (“send error\n“);
exit (EXIT_FAILURE);
}
printf(“send\n“ );
memset(recvbuf0 sizeof(recvbuf));
addr_len = sizeof (s_addr);
umask(0000);
while(1)
{
len =recvfrom (socketfd recvbuf 516 0(struct sockaddr *) &s_addr &addr_len);//接收数据 数据缓冲/数据缓冲区长度/0/目的网络地址/地址长度

if (len < 0)
     {
       perror (“recvfrom“);//
       break;
     }
     if (fd == 0)
     {
     if ((fd = open(filename O_RDWR|O_CREAT 0777))<0)
     {
     perror(“open“);
     break;
     }
     }
     write(fdrecvbuf+4len-4);
     if (len < 516)
     {
     printf(“read success\n“);
     sendto(socketfdack40(struct sockaddr*) &s_addr sizeof(s_addr));
     break;
     }
     bzero (ack sizeof (ack));
     memcpy(ackrecvbuf4);
     ack[1]++;
   if ((sendto (socketfd ack 4 0 (struct sockaddr *) &s_addrsizeof (s_addr))) < 0)
     {
       perror (“sendto“);
       break;
     }
     bzero (recvbuf sizeof (recvbuf));
}
    close(socketfd);
    close(fd);

}
else if (strcmp (argv[2]“put“) == 0)
{
addr_len = sizeof(struct sockaddr_in);
sprintf (sendbuf “%c%c%s%cnetascii%c“ 0 2 filename 0 0);
sendto(socketfd sendbuf 12+strlen(filename) 0 (struct sockaddr*)&s_addrsizeof(s_addr));
char block_num = 0;
while(1)
{
memset(recvbuf0sizeof(recvbuf));
memset(&s_addr‘\0‘sizeof(struct sockaddr_in));
recvfrom(socketfdrecvbuf5160(struct sockaddr *) &s_addr&addr_len);//传送
if (fd == 0)
{
if ((fd = open(filenam

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        3745  2013-07-08 04:40  file_client.c

评论

共有 条评论