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...