⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arq_r.cpp

📁 ARQ协议的实验。可以通过次软件来模拟ARQ协议.
💻 CPP
字号:
// ARQ_r.cpp : Defines the entry point for the application.
//=========================================================================
//陈家琪,计算机网络课程,理想信道的数据链路层协议,接收端程序

//=========================================================================
//VC 6.0   add  WSOCK32.LIB in Project -> Settings... ->  Link
#include <winsock.h>
//-------------------------------------------------------------------------
// Global Variables:
HINSTANCE hInst;				// 实例句柄,方便各程序访问
HWND hWnd;						// 主窗口句柄,方便各程序访问
char Title[]=" 接收端[8888]-理想信道 ";	// 窗口标题 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,始终在顶层,任务栏不显示。
	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		//远程端口
#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("物理层收\r\n到的信息\r\n",3,50,90,220,MEMO1,hW,hInst);
		CreateMemo("上交网络\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();			//物理层:接收一个字节
			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) "物理层收\r\n到的信息\r\n");
			SetDlgItemText(hW,MEMO2,(LPSTR) "上交网络\r\n层的信息\r\n");
			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];
}
//-------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -