?? arq_r.cpp
字號(hào):
// ARQ_r.cpp : Defines the entry point for the application.
//=========================================================================
//陳家琪,計(jì)算機(jī)網(wǎng)絡(luò)課程,理想信道的數(shù)據(jù)鏈路層協(xié)議,接收端程序
//=========================================================================
//VC 6.0 add WSOCK32.LIB in Project -> Settings... -> Link
#include <winsock.h>
//-------------------------------------------------------------------------
// Global Variables:
HINSTANCE hInst; // 實(shí)例句柄,方便各程序訪問(wèn)
HWND hWnd; // 主窗口句柄,方便各程序訪問(wèn)
char Title[]=" 接收端[8888]-理想信道 "; // 窗口標(biāo)題 The title bar text
int WinX0=300,WinY0=10,WinW=200,WinH=300; // 窗口位置、大小
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//-------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lp,int nC)
{
MSG msg;
hInst = hI; // Store instance handle in our global variable
WNDCLASS wc;
memset(&wc,0,sizeof(WNDCLASS));
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hI;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wc.lpszClassName = "Win32API";
RegisterClass(&wc);
//特殊窗口1,始終在頂層,任務(wù)欄不顯示。
hWnd=CreateWindowEx(WS_EX_PALETTEWINDOW,"Win32API",Title,
WS_DLGFRAME|WS_CAPTION|WS_SYSMENU,
WinX0,WinY0,WinW,WinH, // 窗口位置、大小
NULL,NULL,hI,NULL);
if (!hWnd) return FALSE;
ShowWindow(hWnd, nC);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//-------------------------------------------------------------------------
//按鈕
HWND CreateButton(char *Titel,int x0,int y0,int w,int h,int ID,HWND hW,HINSTANCE hInst)
{
return CreateWindowEx(WS_EX_PALETTEWINDOW,"BUTTON",Titel,
WS_VISIBLE | WS_CHILD ,
x0,y0,w,h, hW,(HMENU)ID,hInst,NULL);
}
//-------------------------------------------------------------------------
//單行編輯框
HWND CreateEdit(char *Titel,int x0,int y0,int w,int h,int ID,HWND hW,HINSTANCE hInst)
{
return CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",Titel,
WS_VISIBLE | WS_CHILD |
ES_LEFT | ES_MULTILINE | WS_HSCROLL ,
x0,y0,w,h, hW,
(HMENU)ID,hInst,NULL);
}
//-------------------------------------------------------------------------
//多行文本框
HWND CreateMemo(char *Titel,int x0,int y0,int w,int h,int ID,HWND hW,HINSTANCE hInst)
{
return CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",Titel,
WS_VISIBLE | WS_CHILD |
ES_LEFT | ES_MULTILINE |ES_READONLY|
WS_HSCROLL | WS_VSCROLL,
x0,y0,w,h,
hW,(HMENU)ID,hInst,NULL);
}
//-------------------------------------------------------------------------
//向多行文本框中添加文本
void Puts(HWND hW,int ID_EDIT,char *str)
{
int nLen=GetWindowTextLength(GetDlgItem(hW,ID_EDIT));
SendMessage(GetDlgItem(hW,ID_EDIT),EM_SETSEL,nLen,nLen);
SendMessage(GetDlgItem(hW,ID_EDIT),EM_REPLACESEL,TRUE,(long)(LPCTSTR)str);
nLen=GetWindowTextLength(GetDlgItem(hW,ID_EDIT));
SendMessage(GetDlgItem(hW,ID_EDIT),EM_SETSEL,nLen,nLen);
SendMessage(GetDlgItem(hW,ID_EDIT),EM_REPLACESEL,TRUE,(long)(LPCTSTR)"\r\n");
}
//-------------------------------------------------------------------------
void wlc(BYTE Fram);
//按鈕
#define BUTTON1 501
#define BUTTON2 502
//單行編輯框
#define EDIT1 601
//多行文本框
#define MEMO1 801
#define MEMO2 802
//-------------------------------------------------------------------------
WSADATA ws;
SOCKET Cs1,Cs2;
struct sockaddr_in Cs1A,Cs2A;
char aa[200];
char bb[200];
int d,i;
#define Cs2Port 7777 //遠(yuǎn)程端口
#define Cs1Port 8888 //本地端口
#define Cs1IP "127.0.0.1" //本地網(wǎng)址
#define Cs2IP "127.0.0.1" //遠(yuǎn)程網(wǎng)址
//以上不需改動(dòng)!
//-------------------------------------------------------------------------
//你可以在這里定義變量
void wlcSend(BYTE c); //物理層:發(fā)送一個(gè)字節(jié)
BYTE wlcRev(); //物理層:接收一個(gè)字節(jié)
//-------------------------------------------------------------------------
//消息處理
LRESULT CALLBACK WndProc(HWND hW, UINT msg, WPARAM wP, LPARAM lP)
{
switch (msg)
{
case WM_DESTROY:
WSAAsyncSelect(Cs1, hW, 0, 0);
closesocket(Cs1);
WSACleanup( );
PostQuitMessage(0);
break;
case WM_CREATE:
WSAStartup(0x0101,&ws);
Cs1=socket(AF_INET, SOCK_DGRAM,0);
Cs1A.sin_family=AF_INET;
Cs1A.sin_port = htons(Cs1Port);
// Cs1A.sin_addr.s_addr =INADDR_ANY;//在本機(jī)設(shè)置的網(wǎng)址(可能多個(gè))中,都有效。
Cs1A.sin_addr.s_addr =inet_addr(Cs1IP);
d=bind(Cs1,(struct sockaddr *) &Cs1A,sizeof(Cs1A));
if(d==-1)
{
MessageBox(0,"端口發(fā)生沖突","數(shù)字信道仿真",0);
PostQuitMessage(0);
}
Cs2A.sin_family=AF_INET;
Cs2A.sin_port = htons(Cs2Port);
Cs2A.sin_addr.s_addr =inet_addr(Cs2IP);
WSAAsyncSelect(Cs1,hW,WM_USER+1,FD_READ);
Beep(2000,100);
CreateEdit("接收端",2,2,130,20,EDIT1,hW,hInst);
CreateButton("Quit", 140,2,50,16,BUTTON1,hW,hInst);
CreateButton("Reset",140,30,50,16,BUTTON2,hW,hInst);
CreateMemo("物理層收\(chéng)r\n到的信息\r\n",3,50,90,220,MEMO1,hW,hInst);
CreateMemo("上交網(wǎng)絡(luò)\r\n層的信息\r\n",100,50,90,220,MEMO2,hW,hInst);
break;
//============================================================================
//接收消息事件:
//你可以在這里編寫代碼:
case WM_USER+1:
switch(LOWORD(lP))
{
case FD_READ:
bb[0]=wlcRev(); //物理層:接收一個(gè)字節(jié)
bb[1]=0;
char buf[22];
wsprintf(buf,"%02XH",(unsigned char)bb[0]);
Puts(hW,MEMO1,buf); //顯示,物理層收到的信息
bb[0]=(bb[0]&0x0F)+0x30;//去掉高4位內(nèi)容,低4位轉(zhuǎn)為ASCII碼
Puts(hW,MEMO2,bb); //顯示,上交網(wǎng)絡(luò)層的信息
break;
}
break;
case WM_COMMAND:
switch(wP)
{
case BUTTON1: //退出程序
PostQuitMessage(0);
break;
case BUTTON2: //清除信息框內(nèi)容
SetDlgItemText(hW,MEMO1,(LPSTR) "物理層收\(chéng)r\n到的信息\r\n");
SetDlgItemText(hW,MEMO2,(LPSTR) "上交網(wǎng)絡(luò)\r\n層的信息\r\n");
break;
}
}
return DefWindowProc(hW,msg,wP,lP);
}
//-------------------------------------------------------------------------
void wlcSend(BYTE c) //物理層:發(fā)送一個(gè)字節(jié)
{
char a[2];
a[0]=c; a[1]=0;
d = sizeof(Cs2A);
sendto(Cs1,a,strlen(a),0,(struct sockaddr *) &Cs2A,d);
}
//-------------------------------------------------------------------------
BYTE wlcRev() //物理層:接收一個(gè)字節(jié)
{
char b[1];
d = sizeof(Cs2A);
d=recvfrom(Cs1,b,1,0,(struct sockaddr *) &Cs2A,&d);
return b[0];
}
//-------------------------------------------------------------------------
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -