www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]開發(fā)環(huán)境:ubuntu所用知識點(diǎn):c,socket, tcp/ip協(xié)議A)本實(shí)驗(yàn)主要實(shí)現(xiàn)tftp協(xié)議的服務(wù)器與客戶端。服務(wù)器實(shí)現(xiàn)功能有:1)接收處理客戶端請求,上傳下下載文件2)進(jìn)行用戶驗(yàn)證3)對傳輸

開發(fā)環(huán)境:ubuntu

所用知識點(diǎn):c,socket, tcp/ip協(xié)議

A)本實(shí)驗(yàn)主要實(shí)現(xiàn)tftp協(xié)議的服務(wù)器與客戶端。

服務(wù)器實(shí)現(xiàn)功能有:

1)接收處理客戶端請求,上傳下下載文件

2)進(jìn)行用戶驗(yàn)證

3)對傳輸數(shù)據(jù)進(jìn)行加密解密處理

4)生成日志文件

客戶端實(shí)現(xiàn)功能有:

1)向服務(wù)器發(fā)出請求,上傳或下載文件

2)對傳輸數(shù)據(jù)加密解密

3)對用戶信息進(jìn)行MD5加密

B)相關(guān)代碼實(shí)現(xiàn):

宏定下:

#ifndef MAKEWORD

#define MAKEWORD(l,h) ((unsigned short)(((unsigned char)(l))|(((unsigned short)(unsigned char)(h))<<8)))

#endif

#define WSA_MAJOR_VERSION 1

#define WSA_MINOR_VERSION 1

#define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION)

#define TFTP_OCTET 1

#define TFTP_WSTAT_FIRSTACK 0

#define TFTP_WSTAT_NEXTACK 1

#define TFTP_WSTAT_LASTACK 2

#define TFTP_RRQ 1 //讀請求

#define TFTP_WRQ 2 //寫請求

#define TFTP_DATA 3 //數(shù)據(jù)

#define TFTP_ACK 4 //ACK

#define TFTP_ERROR 5 //Error

#define MAX_RETRY 3 //最大重復(fù)次數(shù)

#define TFTP_NOTEND_DATALEN 512+2+2 //數(shù)據(jù)塊長度

//錯(cuò)誤種類

#define Not_defined 0

#define File_not_found 1

#define Access_violation 2

#define Disk_full 3

#define Illegal_TFTP_operation 4

#define Unknown_port 5

#define File_already_exists 6

#define No_such_user 7

#define Time_out 8

#define Read_file_Error 9

#define Cannot_create_file 10

#define passwd_or_user_error 11

包的填充:

#include "define.h"

#include

#include

int makeack(unsigned short num,char *buffer,int size );

int makedata(unsigned short num,char *data,int datasize,char *buffer,int bufsize);

int makeerr(unsigned short num,char *buffer);

//ACK包填充

int makeack(unsigned short num,char *buffer,int size )

{

int pos = 0;

buffer[pos] = 0;

pos++;

buffer[pos] = TFTP_ACK; //操作碼為04

pos++;

buffer[pos] = (char)(num>>8);//塊號2個(gè)字節(jié)

pos++;

buffer[pos] = (char)num;

pos++;

return pos;

}

//Data包填充

int makedata(unsigned short num,char *data,int datasize,char *buffer,int bufsize)

{

int pos = 0;

buffer[pos] = 0;

pos++;

buffer[pos] = TFTP_DATA; //操作碼為03

pos++;

buffer[pos] = (char)(num>>8);//塊號

pos++;

buffer[pos] = (char)num;

pos++;

memcpy(&buffer[pos],data,datasize);//填充數(shù)據(jù)

pos = pos + datasize;

return pos;

}

//ERROR包填充

int makeerr(unsigned short num,char *buffer)

{

int pos=0;

buffer[pos]=0;

pos++;

buffer[pos]=TFTP_ERROR; //操作碼為05

pos++;

buffer[pos] = (char)(num>>8); //錯(cuò)誤種類號

pos++;

buffer[pos] = (char)num;

pos++;

return pos;

}

日志log.c實(shí)現(xiàn)

#include

static char log[100]; //日志

char datetime[20]; //記錄時(shí)間變量

int timeout=2,retran=3; //服務(wù)器參數(shù)

void record(int a,struct sockaddr_in *sin,char *file)

{

char tem[60];

time_t t=time(0); //初始化日歷時(shí)間

strftime(datetime,sizeof(datetime),"%y/%m/%d %X",localtime(&t));//將時(shí)間格式化

strcat(log,datetime);//將時(shí)間寫入記錄

//將字符串格式化

bzero(&tem,sizeof(tem));

if(a==1)

sprintf(tem," 收到來自 %s 上傳文件 %s 的請求。n",inet_ntoa(sin->sin_addr),file);

if(a==2)

sprintf(tem," %s 上傳文件 %s 完畢。n",inet_ntoa(sin->sin_addr),file);

if(a==3)

sprintf(tem," 收到來自 %s 下載文件 %s的請求。n",inet_ntoa(sin->sin_addr),file);

if(a==4)

sprintf(tem," %s 下載文件 %s 完畢。n",inet_ntoa(sin->sin_addr),file);

if(a==5)

sprintf(tem," 出現(xiàn)出錯(cuò),操作中斷。n",inet_ntoa(sin->sin_addr),file);

//將具體信息寫入記錄

strcat(log,tem);

FILE *write;

if((write=fopen("log.txt","a+"))==NULL)

printf("打開記錄文件失敗n");

//將記錄寫入文件

fwrite(&log,strlen(log),1,write);

fclose(write);

bzero(&log,sizeof(log));

}

加密解密實(shí)現(xiàn)

#include

#include

#include

int decrypt(FILE *in,FILE *out);

int encrypt(FILE *in,FILE *out);

unsigned char atoh(char *hexstr);

int encrypt(FILE *in,FILE *out)

{

if(in == NULL || out == NULL)

{

fprintf(stderr,"%sn","file error!n");

return -1;

}

unsigned char hex;

while(fread(&hex,1,1,in))

{

hex = ~hex^0x98;

fprintf(out,"%02X",hex);

}

return 0;

}

int decrypt(FILE *in,FILE *out)

{

if(in == NULL || out == NULL)

{

fprintf(stderr,"%sn","file error!");

return -1;

}

unsigned char hexstr[3];

unsigned char hex = 0;

int i = 0;

while(fread(hexstr,2,1,in))

{

hex = atoh(hexstr);

hex = ~(hex ^ 0x98);

fwrite(&hex,1,1,out);

}

return 0;

}

/* convert string to hex */

unsigned char atoh(char *hexstr)

{

int i;

int hextodec[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

char chtodec[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

unsigned char hexnum = 0;

for(i = 0; i < sizeof(chtodec); ++i)

{

if(hexstr[0] == chtodec[i])

{

hexnum += hextodec[i]*16;

}

}

for(i = 0; i < sizeof(chtodec); ++i)

{

if(hexstr[1] == chtodec[i])

{

hexnum += hextodec[i];

}

}

return hexnum;

}

上傳數(shù)據(jù):

//上傳函數(shù)

void upload(struct sockaddr_in sour_addr,char buffer[])

{

char send_buffer[1024] = {0};

char recv_buffer[1024] = {0};

struct sockaddr_in dest_addr;

struct timeval timeout = {10,0};

int sour_len = 0;

int ret = 0;

int len = 0;

int flen = 0;

fd_set fdr;

unsigned short lastdata = 0;

unsigned short blocknum = 0;

FILE *file;

FILE *decrypt_file = NULL;

char filename[256];

//獲取文件名

strcpy(filename,buffer+2);

dest_addr.sin_family = AF_INET;

dest_addr.sin_port = sour_addr.sin_port;

dest_addr.sin_addr.s_addr = inet_addr(desthost);//

//如果本地存在同名文件

if((file=fopen(filename,"rb"))!=NULL)

{

//發(fā)送一個(gè)error包,報(bào)告存在同名文件

printf("***存在同名文件***");

len = makeerr(File_already_exists,send_buffer);

ret = sendto(sock,send_buffer,len,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));

record(5,&sour_addr,filename);

return;

}

//建立文件

if((file=fopen(filename,"w+b"))==NULL)

{

//如果失敗,發(fā)送error包

printf("創(chuàng)建文件失敗n");

len = makeerr(Cannot_create_file,send_buffer);

ret = sendto(sock,send_buffer,len,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));

record(5,&sour_addr,filename);

return;

}

//發(fā)送ACK

len = makeack(blocknum,send_buffer,sizeof(send_buffer));

ret = sendto(sock,send_buffer,len,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));

blocknum++;

while(1){

FD_ZERO(&fdr);

FD_SET(sock, &fdr);

ret = select(sock+1, &fdr, NULL,NULL, &timeout);

if(-1==ret)

{

printf("Socket 錯(cuò)誤n");

fclose(file);

record(5,&sour_addr,filename);

return;

}

else

{

if(0==ret)

{

printf("超時(shí)n");

fclose(file);

record(5,&sour_addr,filename);

return;

}

else

{

if (FD_ISSET(sock,&fdr))

{

//接收數(shù)據(jù)包

sour_len = sizeof(struct sockaddr);

ret = recvfrom(sock,recv_buffer,sizeof(recv_buffer),0,(struct sockaddr *)&sour_addr,&sour_len);

//如果是數(shù)據(jù)包

if(TFTP_DATA==recv_buffer[1])

{

lastdata = MAKEWORD(recv_buffer[3],recv_buffer[2]); //塊號

//如果塊號正確

if(lastdata == blocknum)

{

//發(fā)送ACK包

len = makeack(blocknum,send_buffer,sizeof(send_buffer));

sendto(sock,send_buffer,len,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));

blocknum++;

if(blocknum > 65535)

blocknum = 0;

//最后一包

if(ret < TFTP_NOTEND_DATALEN)

{

//寫入文件

fwrite(&recv_buffer[4],1,ret-4,file);

flen = flen + ret -4;

#ifdef _DEBUG_

printf("%s %s %dn", __FILE__, __FUNCTION__, __LINE__);

printf("*****傳輸結(jié)束,共收到 %d 字節(jié)*****n",flen);

#endif

rewind(file);

if((decrypt_file =fopen("decrypt_temp","wb+"))==NULL){

printf("decrypt file open error n");

return;

}

decrypt(file, decrypt_file);

fclose(decrypt_file);

rename("decrypt_temp", filename);

fclose(file);

record(2,&sour_addr,filename);

return;

}

else

{

fwrite(&recv_buffer[4],1,512,file);

flen = flen + 512;

#ifdef _DEBUG_

printf("%s %s %dn", __FILE__, __FUNCTION__, __LINE__);

printf("已收到 %d 字節(jié)n",flen);

#endif

}

}

else

{

//重新發(fā)送ACK包

printf("數(shù)據(jù)包塊號錯(cuò)誤.n");

sendto(sock,send_buffer,len,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));

}

}

}

}

}

}

}

C)客戶端與服務(wù)都配有工程管理器,可通過make 完成編譯。

D)實(shí)現(xiàn)效果:





本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉