回應資料接收 程式設計實現TCP協議資料傳輸

2021-10-16 02:19:50 字數 4306 閱讀 1011

1.實驗目的

① 通過本實驗加深對tcp協議傳輸資料過程的理解。

② 學習套接字的使用。

2.實驗內容

以使用visual c++程式語言,編寫tcp傳輸資料的程式,在兩台計算機上實現tcp資料傳輸為例,要求實現以下功能:

① 在乙個工程中,建立乙個對話方塊,包括「傳送資料」和「接收資料」視窗。

② 一台計算機在傳送資料視窗,輸入目標計算機的ip位址和傳送的對話內容,目標計算機在接收資料視窗能夠顯示對方傳送的資料資訊。

③ 程式設計實現兩台計算機相互傳送和接收資料資訊。

3.實驗步驟

① 啟動visual c++ 6.0,用mfc建立對話方塊。

③ 在「您要建立的應用程式型別」對話方塊中,選擇「基本對話方塊」單選按鈕,完成預設視窗的建立,刪除預設視窗中的「按鈕」和「編輯框」。

④ 建立資料傳輸對話方塊。

l 選擇控制項中的「編輯框」控制項,在對話方塊的上方和右下方分別建立「傳送」和「接收」資料內容視窗。

l 選擇「ip位址」控制項,在對話方塊的下方左側建立所要輸入的目標位址視窗。

選擇「按鈕」控制項,實現傳送資料操作。

l 建立兩個「組框」分別起名為「接收資料」和「傳送資料」,以實現程式的可視效果。完成後的對話方塊如圖6-9所示。

⑤ 為了程式設計方便,將接收「編輯框」和傳送「編輯框」的id改為idc_edit_recv和idc_edit_send,按鈕的屬性改為idc_btn_send。

⑥ 參考程式

//呼叫套接字初始化函式

bool cchatdlg::oninitdialog()

cdialog::oninitdialog();

// todo: add extra initialization here在該句下新增以下內容

initsocket();

recvparam *precvparam=new recvparam;

precvparam->sock=m_socket;

precvparam->hwnd=m_hwnd;

handle hthread=createthread(null,0,recvproc,(lpvoid)precvparam,0,null);

closehandle(hthread);

在接收資料時,如果沒有資料到來,則recvfrom函式則會阻塞,從而導致程式暫停執行,所以將接收資料的工作放到單獨的執行緒來完成。給執行緒傳遞兩個引數,乙個是建立的套接字,乙個是對話方塊的控制代碼,即接收編輯框的控制代碼,當執行緒接收到資料之後,可以將資料傳回給對話方塊中的編輯框,經過處理後顯示。

//對套接字進行初始化 自定義函式

bool cchatdlg::initsocket()

m_socket=socket(af_inet,sock_dgram,0); //建立用於監聽的套接字

if(invalid_socket==m_socket)

messagebox("套接字建立失敗");

return false;

//繫結套接字

sockaddr_in addrsock;

addrsock.sin_family=af_inet; //位址族 af_inet

addrsock.sin_port=htons(6000); //分配給套接字的埠

addrsock.sin_addr.s_un.s_addr=htonl(inaddr_any);

// ip位址指定為inaddr_any,允許套接字向任何分配給本地機器的ip位址傳送或接收資料

int retval;

retval=bind(m_socket,(sockaddr*)&addrsock,sizeof(sockaddr));

//將該套接字繫結到本地的某個位址和埠上

if(socket_error==retval)

closesocket(m_socket);

messagebox("繫結失敗");

return false;

return true;

//在cchatdlg標頭檔案裡增加以下內容

#define wm_recvdata wm_user+1 //增加自定義wm_recvdata訊息的定義

struct recvparam //增加recvparam結構體的定義

socket sock;

hwnd hwnd;

afx_msg void onrecvdata(wparam wparam,lparam lparam);

// 增加訊息響應函式原型的宣告

//接收資料,自定義執行緒函式,該函式一直在執行

dword winapi recvproc(lpvoid lpparameter)

socket sock=((recvparam*)lpparameter)->sock;

hwnd hwnd=((recvparam*)lpparameter)->hwnd;

sockaddr_in addrfrom; //接收客戶端的位址資訊

int len=sizeof(sockaddr);

char recvbuf[200];

char tempbuf[300];

int retval;

while(true)

retval=recvfrom(sock,recvbuf,200,0,(sockaddr*)&addrfrom,&len);

if(socket_error==retval)

break;

printf(tempbuf,"%s 說:%s",inet_ntoa(addrfrom.sin_addr),recvbuf);

//將資料傳給對話方塊

::postmessage(hwnd,wm_recvdata,0,(lparam)tempbuf);

//傳送訊息,只要一有訊息,就傳送recvdata訊息,也就是呼叫函式onrecvdata()

return 0;

//把接收到的資料在編輯框idc_edit_recv裡進行顯示

void cchatdlg::onrecvdata(wparam wparam, lparam lparam)

cstring str=(char *)lparam;

cstring strtemp;

getdlgitemtext(idc_edit_recv,strtemp);

//在網路中接收到的內容儲存到strtemp變數中,然後顯示到接收視窗中

str+="rn";

str+=strtemp;

setdlgitemtext(idc_edit_recv,str);

// 傳送資料,單擊「傳送」按鈕的訊息響應函式

void cchatdlg::onbtnsend()

dword dwip;

//首先得到控制項指標

((cipaddressctrl*)getdlgitem(idc_ipaddress1))->getaddress(dwip);

//位址變數視窗

sockaddr_in addrto;

addrto.sin_family=af_inet;

addrto.sin_port=htons(6000);

addrto.sin_addr.s_un.s_addr=htonl(dwip);

cstring strsend;

getdlgitemtext(idc_edit_send,strsend);//傳送視窗的內容儲存在變數strsend中

sendto(m_socket,strsend,strsend.getlength()+1,0, (sockaddr*)&addrto,sizeof(sockaddr));

setdlgitemtext(idc_edit_send,"");

⑦ 以下為兩台計算機的程式執行結果,設計算機1的ip位址為192.168.32.110,計算機2的ip位址為192.168.32.117。圖6-10所示為計算機1給計算機2傳送的訊息,圖6-11所示為計算機2給計算機1回應的訊息,圖6-12為計算機1收到的計算機2回應資訊。

圖6-10 計算機1傳送訊息視窗 圖6-11 計算機2傳送訊息視窗

圖6-12 計算機1收到的回應訊息視窗

TCP協議接收與傳送資料

tcp 建立連線通道 資料無限制 速度慢可靠 tcp協議傳送資料 1 建立傳送端的socket物件 這一步如果成功,就說明連線已經建立成功了。2 獲取輸出流,寫資料 3 釋放資源 public static void main string args throws ioexception tcp協議...

網路程式設計 TCP分塊接收資料(AIO)(IOCP)

1 前提 每次投遞的接收緩衝區 在它返回後 就不再用它進行2次投遞了 於是 接收緩衝區 在返回的時候,資料都是 從接收緩衝區的偏移 0 處開始填充的,且 接收緩衝區 可能被填滿 也可能未被填滿。1.1 假設 現在 接收到的 tcp資料塊 已經是正確的順序了 不管用何種手段,反正是保證了這個前提了 假...

pyhon網路程式設計使用tcp傳送 接收資料

1 建立套接字 2 繫結本地埠 客戶端也就可以不繫結,不繫結時系統隨機開啟乙個埠 3 連線伺服器位址 4 傳送或接收伺服器資料 5 關閉套接字 tcp傳送資料例項 import socket 定義伺服器連線函式 def tcpclient to sever tcp soctet tcp soctet...