资源简介
基于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
相关资源
- 图书管理信息系统的设计和实现.doc
- relief算法的代码实现
- 二叉查找树的实现
- 用DirectSound实现声音的实时采集、处理
- ASK调制与解调电路设计及仿真实现
- 微分方程的数值解法与程序实现 华冬
- 重写Spinner类,实现点击后弹出带有确
- Linux内核链表实现多客户端连接服务器
- 基于FPGA的BISS-C协议编码器接口技术研
- 编程实现Simplified-AES算法加密过程和解
- 模拟进程调度GUI实现
- opencv实现图像灰度化和二值化
- 数据链路层滑动窗口协议的设计与实
- 北邮计算机网络数据链路层实验滑动
- WebSocket安卓客户端实现详解(二)-
- WebSocket安卓客户端实现详解(三)–
-
Cluster ba
sed Routing Protocol在NS2下的实 - DTMF采用RFC2833进行带外传输的实现
- Quartus verilog HDL语言实现qpsk的仿真
- 用verilog语言实现的流水灯程序
- EDA实现8位数码管动态扫描实验
- cuda实现LU分解解线性方程
- 基于DSP指纹识别核心算法的设计与实
- struts1实现用户登录注册
- 最基本的可以实现的EZW源代码
- P2P之UDP穿透NAT的原理与实现
- VC实现teechart时间轴自右向左推移
- 基于qt实现的画图板
- LCD12864实现贪吃蛇游戏
- 基于API-HOOK的数据文件透明加解密系统
评论
共有 条评论