基於Socket的檔案傳輸(使用CSocket類)

2022-05-07 19:39:11 字數 3913 閱讀 9629

本軟體使用

mfc採用物件導向的方法實現了基於

socket

的檔案傳輸。這是原來研究生課程的結課作業,實現了socket的傳送和接收,以及讀取ini配置檔案等操作。使用了csocket類

以下是當時結課作業

的正文:

一.軟體特點如下:

1.採用了多執行緒的方法,檔案傳輸時使用

afxbeginthread()

開啟新執行緒

void

cclientsockdlg::onbnclickedsend()

檔案的傳送和接收都開起了新執行緒

uintthread_send(lpvoid lpparam)

2.支援從配置檔案

configuration.ini

中獲取伺服器引數

採用getprivateprofilestring()

和getprivateprofileint()

分別獲取位於

serverconfiguration.ini

檔案中的

string

型別的ip

和int

型別的port

cstring ip;

intport;

getprivateprofilestring

(l"serverconfiguration",l"ip",l"

沒有讀取到資料

!",ip.getbuffer(10),10,l".\\configuration.ini");

port=getprivateprofileint(l"serverconfiguration",l"port",0,l".\\configuration.ini");

3.採用了物件導向的設計方式,功能之間按模組劃分

mfc本身具有良好的物件導向的特性,本程式嚴格按照

mfc框架結構編寫**,每個按鈕對應乙個功能函式,降低了**之間的耦合性,有利於程式的擴充套件和復用。

void

cserversockdlg::onbnclickedchoose()

void

cserversockdlg::onbnclickedsend()

void

cserversockdlg::onbnclickedrecvdata()

void

cserversockdlg::onbnclickedabout()

void

cserversockdlg::onbnclickedwriteini()

4.採用了

csocket

類,**相對更簡單

csocket

類是mfc

框架對socket

程式設計中的

winsockapi

的封裝,因此通過這個類管理收發資料更加便利。**也跟那個既簡單易懂。

//建立

if(!clientsock.socket())

//連線

if(!clientsock.connect(ip,port))

else

file.close();

delete szbuff;

clientsock.close();

(dlg->getdlgitem(idc_send))->enablewindow(true);

afxmessagebox(_t("

檔案傳送成功

"));

dlg->setdlgitemtextw(idc_filepathname,_t(""));

}return 0;

5.支援資料在伺服器與客戶端之間雙向傳輸

本程式不但可以從客戶端往伺服器端傳檔案,而且可以從伺服器端往客戶端傳檔案。

但是互傳檔案的方式並不是完全相同的。

伺服器端不管是接收檔案還是傳送檔案始終是對繫結的埠進行監聽。

//繫結

if(!serversock.bind(port))

//監聽

if(!serversock.listen(10))

客戶端不管是接收檔案還是傳送檔案始終是進行連線。

if(!clientsock.connect(ip,port))

else

cstring ip;

int port;

getprivateprofilestring(l"serverconfiguration",l"ip",l"沒有讀取到資料!",ip.getbuffer(100),100,l".\\configuration.ini");

port=getprivateprofileint(l"serverconfiguration",l"port",0,l".\\configuration.ini");

//建立

if(!clientsock.socket())

//連線

// if(!clientsock.connect(_t("127.0.0.1"),8088))

if(!clientsock.connect(ip,port))

else

uint nsize = 0;

uint nsend = 0;

char *szbuff=null;

//傳送

while(nsizegetdlgitem(idc_send))->enablewindow(true);

afxmessagebox(_t("檔案傳送成功"));

dlg->setdlgitemtextw(idc_filepathname,_t(""));

} return 0;

}以及伺服器端使用csocket監聽的**:

//----------------------------監聽檔案的執行緒------------------------------

uint thread_func(lpvoid lpparam) //接收檔案的執行緒函式

cstring ip;

int port;

getprivateprofilestring(l"serverconfiguration",l"ip",l"沒有讀取到資料!",ip.getbuffer(100),100,l".\\configuration.ini");

port=getprivateprofileint(l"serverconfiguration",l"port",0,l".\\configuration.ini");

char errbuf[100]=;// 臨時快取

systemtime t; //系統時間結構

cfile logerrorfile;

if(!logerrorfile.open(_t("logerrorfile.txt"),cfile::modecreate|cfile::modereadwrite))

csocket serversock;

csocket clientsock;

//建立

if(!serversock.socket())

bool boptval = true;

int boptlen = sizeof(bool);

serversock.setsockopt(so_reuseaddr,(void *)&boptval,boptlen,sol_socket);

//繫結

if(!serversock.bind(port))

//監聽

if(!serversock.listen(10))

getlocaltime(&t);

t.whour,t.wminute,t.wsecond);

int len = strlen(errbuf);

logerrorfile.write(errbuf,len);

afxmessagebox(_t("啟動成功等待接收檔案"));

while(1)

else

}return 0;

}

基於Socket的檔案傳輸(使用CSocket類)

本軟體使用 mfc採用物件導向的方法實現了基於 socket 的檔案傳輸。這是原來研究生課程的結課作業,實現了socket的傳送和接收,以及讀取ini配置檔案等操作。使用了csocket類 以下是當時結課作業 的正文 一 軟體特點如下 1.採用了多執行緒的方法,檔案傳輸時使用 afxbeginthr...

基於Socket的檔案傳輸(使用CSocket類)

本軟體使用 mfc採用物件導向的方法實現了基於 socket 的檔案傳輸。這是原來研究生課程的結課作業,實現了socket的傳送和接收,以及讀取ini配置檔案等操作。使用了csocket類 以下是當時結課作業 的正文 一 軟體特點如下 1.採用了多執行緒的方法,檔案傳輸時使用 afxbeginthr...

基於socket的檔案傳輸協議

1 我們先搭建乙個乙個伺服器與客戶機並使他們進行通訊 2 在客戶機中對輸入的指令進行判斷,將指令轉化成對應的列舉型別傳送給服務機 3 服務機對傳送過來的ftp cmd的值進行判斷,並執行相對應的功能 4 ls功能的實現 通過popen實現,獲取內容傳送客戶機並顯示 get 對指令進行分割,讀取分割後...