www.pudn.com > ARQprotocel.rar > ARQ_r.cpp
// ARQ_r.cpp : Defines the entry point for the application. //========================================================================= //陈家琪,计算机网络课程,理想信道的数据链路层协议,接收端程序 //========================================================================= #include "stdafx.h" //VC 6.0 add WSOCK32.LIB in Project -> Settings... -> Link #include//-------------------------------------------------------------- // Global Variables: HINSTANCE hInst; // current instance LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //-------------------------------------------------------------- int APIENTRY WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lp,int nC) { MSG msg; HWND hWnd; 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_WINDOW; wc.lpszClassName = "W1"; RegisterClass(&wc); hWnd=CreateWindow("W1","接收端[8888]-理想信道", WS_DLGFRAME|WS_SYSMENU, 300,10,200,300, 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) { char b[888]; GetDlgItemText(hW,ID_EDIT,b,sizeof(b)); strcat(b,"\r\n"); strcat(b,str); SetDlgItemText(hW,ID_EDIT,(LPSTR) b); SendMessage(GetDlgItem(hW,ID_EDIT),WM_VSCROLL,SB_THUMBPOSITION+1000*0x10000,0); } //--------------------------------------------------------------------------- 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 //远程端口 #define Cs1Port 8888 //本地端口 #define Cs1IP "127.0.0.1" //本地网址 #define Cs2IP "127.0.0.1" //远程网址 //以上不需改动! //-------------------------------------------------------------- //你可以在这里定义变量 void wlcSend(BYTE c); //物理层:发送一个字节 BYTE wlcRev(); //物理层:接收一个字节 //-------------------------------------------------------------- //消息处理 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;//在本机设置的网址(可能多个)中,都有效。 Cs1A.sin_addr.s_addr =inet_addr(Cs1IP); d=bind(Cs1,(struct sockaddr *) &Cs1A,sizeof(Cs1A)); if(d==-1) { MessageBox(0,"端口发生冲突","数字信道仿真",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("物理层收到的信息",0,50,90,220,MEMO1,hW,hInst); CreateMemo("上交网络层的信息",100,50,90,220,MEMO2,hW,hInst); break; //============================================================================ //接收消息事件: //你可以在这里编写代码: case WM_USER+1: switch(LOWORD(lP)) { case FD_READ: bb[0]=wlcRev(); //物理层:接收一个字节 bb[1]=0; char buf[22]; wsprintf(buf,"%02XH",(unsigned char)bb[0]); Puts(hW,MEMO1,buf); //显示,物理层收到的信息 bb[0]=(bb[0]&0x0F)+0x30;//去掉高4位内容,低4位转为ASCII码 Puts(hW,MEMO2,bb); //显示,上交网络层的信息 break; } break; //============================================================================ case WM_COMMAND: switch(wP) { case BUTTON1: //退出程序 PostQuitMessage(0); break; case BUTTON2: //清除信息框内容 SetDlgItemText(hW,MEMO1,(LPSTR) "物理层收到的信息"); SetDlgItemText(hW,MEMO2,(LPSTR) "上交网络层的信息"); break; } } return DefWindowProc(hW,msg,wP,lP); } //-------------------------------------------------------------- void wlcSend(BYTE c) //物理层:发送一个字节 { char a[2]; a[0]=c; a[1]=0; d = sizeof(Cs2A); sendto(Cs1,a,strlen(a),0,(struct sockaddr *) &Cs2A,d); } //-------------------------------------------------------------- BYTE wlcRev() //物理层:接收一个字节 { char b[1]; d = sizeof(Cs2A); d=recvfrom(Cs1,b,1,0,(struct sockaddr *) &Cs2A,&d); return b[0]; } //--------------------------------------------------------------