資源簡介
基于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
評論
共有 條評論