计算机网络-课件e3.实验三sendudp源程序_第1页
计算机网络-课件e3.实验三sendudp源程序_第2页
计算机网络-课件e3.实验三sendudp源程序_第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 PAGE 7/ SendUDP.cpp : Defines the entry point for the application./#include stdafx.h#include resource.h#include #include #pragma comment(lib, ws2_32)#include TCPIP.h#define MAX_LOADSTRING 100int SendUdp(char *, int , char *, int);void ShowWsaErrorString(char *);void GetHostAddress(SOCKADDR_IN *);vo

2、id CreateAddrPortEditRect(HWND, char *, int);void GetAddrPortEditInt(HWND, char *, int *);void CreateTextEditRect(HWND);void SendTextEdit(HWND);void ExitTextEdit(HWND);SOCKADDR_IN addr_in, addr_out;int SrcPort = 64321;int DstPort = 61234;char DstAddr16 = 192.168.0.103;char PacketText256 = UDP;BOOL S

3、endPacketText = FALSE;/ Global Variables::LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam):switch (message) case WM_COMMAND:wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); / Parse the menu selections:switch (wmId)case IDM_SENDUDP:SendUdp(DstAddr, DstPort, PacketText,

4、strlen(PacketText);break;case IDM_SETDSTADDRPORT:EnableMenuItem(GetMenu(hWnd), IDM_SETPACKETTEXT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);EnableMenuItem(GetMenu(hWnd), IDM_SENDUDP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);CreateAddrPortEditRect(hWnd, DstAddr, DstPort);break; case IDM_GETDSTADDRPORT:G

5、etAddrPortEditInt(hWnd, DstAddr, &DstPort);EnableMenuItem(GetMenu(hWnd), IDM_SETPACKETTEXT, MF_BYCOMMAND | MF_ENABLED);EnableMenuItem(GetMenu(hWnd), IDM_SENDUDP, MF_BYCOMMAND | MF_ENABLED);break;case IDM_SETPACKETTEXT:EnableMenuItem(GetMenu(hWnd), IDM_SETDSTADDRPORT, MF_BYCOMMAND | MF_DISABLED | MF_

6、GRAYED);EnableMenuItem(GetMenu(hWnd), IDM_SENDUDP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);CreateTextEditRect(hWnd);break; case IDM_SENDPACKETTEXT:SendTextEdit(hWnd);SendUdp(DstAddr, DstPort, PacketText, strlen(PacketText);break;case IDM_EXITPACKETTEXT:ExitTextEdit(hWnd);EnableMenuItem(GetMenu(hWnd)

7、, IDM_SETDSTADDRPORT, MF_BYCOMMAND | MF_ENABLED);EnableMenuItem(GetMenu(hWnd), IDM_SENDUDP, MF_BYCOMMAND | MF_ENABLED);break;: return 0;:int InitIpHeader(char *ipBuffer, char *SrcAddr, char *DstAddr, int PayLoadLen)/ IP 头初始化 IP *ip=NULL; ip = (IP *)ipBuffer; ip-Version = (4 ServiceType = 0; ip-Total

8、Len= htons(sizeof(IP) + PayLoadLen); ip-ID= 0; ip-FragOff = 0; ip-TimeToLive= 6; ip-Protocol= 0 x11; ip-HdrChksum = 0; ip-SrcAddr= inet_addr(SrcAddr); ip-DstAddr= inet_addr(DstAddr);/ ip-HdrChksum; return sizeof(IP);int InitUdpHeader(char *Buffer, int SrcPort, int DstPort, int PayLoadLen) UDP *udp =

9、 NULL; udp = (UDP *)Buffer; udp-SrcPort = htons(SrcPort); udp-DstPort = htons(DstPort); udp-TotalLen= htons(sizeof(UDP) + PayLoadLen);/udp-Chksum return sizeof(UDP);char snString1024;int SendUdp(char *DstAddr, int DstPort, char *UdpBuffer, int UdpBufferSize) WSADATA wsaData; SOCKET SendSocket; charS

10、endBuffer65535=0;intIpHdrLen, UdpHdrLen, TotalSize;int flag; intret; TotalSize = sizeof(IP) + sizeof(UDP) + UdpBufferSize;/ 检查 Winsock 版本号,WSAData为WSADATA结构对象 if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) ShowWsaErrorString(Send WSAStartup); return -1; / 创建原始套接字SendSocket = socket(AF_INET, SOCK_RAW,

11、 IPPROTO_UDP);if (SendSocket = INVALID_SOCKET) ShowWsaErrorString(Send Socket);goto retSend; / 设置IP头, 包括optionflag = 1; if (setsockopt(SendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag) = SOCKET_ERROR) ShowWsaErrorString(Send opt);goto retSend; GetHostAddress(&addr_in); if (bind(SendSoc

12、ket, (PSOCKADDR)&addr_in, sizeof(addr_in) = SOCKET_ERROR) ShowWsaErrorString(Send bind);goto retSend; / 初始化IP头IpHdrLen = InitIpHeader(SendBuffer, inet_ntoa(addr_in.sin_addr), DstAddr, UdpBufferSize);/ 发给指定主机/IpHdrLen = InitIpHeader(SendBuffer, inet_ntoa(addr_in.sin_addr), inet_ntoa(addr_in.sin_addr)

13、, UdpBufferSize);/ 发给本机 / 初始化UDP头 UdpHdrLen = InitUdpHeader(&SendBufferIpHdrLen, SrcPort, DstPort, UdpBufferSize); / Copy the payload to the end of the header memcpy(&SendBufferIpHdrLen + UdpHdrLen, UdpBuffer, UdpBufferSize); addr_out.sin_family = AF_INET; addr_out.sin_port = htons(DstPort); addr_ou

14、t.sin_addr.s_addr = inet_addr(DstAddr); ret = sendto(SendSocket, SendBuffer, TotalSize, 0, (const struct sockaddr*)&addr_out, sizeof(addr_out); if (ret = SOCKET_ERROR) ShowWsaErrorString(Send to);goto retSend; else wsprintf(snString, sourAddr=%s, inet_ntoa(addr_in.sin_addr);wsprintf(snString, %s, ds

15、tAddr=%s, snString, inet_ntoa(addr_out.sin_addr);wsprintf(snString, %s, sourPort=%d, dstPort=%d, sendsize=%d, snString, ntohs(addr_in.sin_port), ntohs(addr_out.sin_port), ret); if (!SendPacketText) MessageBox(NULL, snString, sent OK, MB_OK); retSend: closesocket(SendSocket) ; WSACleanup() ; return 0

16、;void ShowWsaErrorString(char *ErrorType)int i, WSAErrorID;char WSAErrorType128;WSAErrorID = WSAGetLastError();wsprintf(WSAErrorType, 错误代码:%d, WSAErrorID);for (i=0; isin_addr = *(in_addr *)pHost-h_addr_list0; /IPaddrin-sin_family = AF_INET;addrin-sin_port = htons(SrcPort);HWND hAddrEdit, hPortEdit,

17、hButton; RECT hAddrPortEditRect = 170, 100, 300, 130;void CreateAddrPortEditRect(HWND hWnd, char *SetDstAddr, int SetDstPort)char hEditString16;HDC hDC;hDC = GetDC(hWnd);TextOut(hDC, hAddrPortEditRect.left-120, hAddrPortEditRect.top+4, 目的主机IP地址:, 16);TextOut(hDC, hAddrPortEditRect.left-120, hAddrPor

18、tEditRect.top+44, 目的端口号: , 16);ReleaseDC(hWnd, hDC);hAddrEdit = CreateWindow(EDIT, NULL, WS_CHILD|WS_VISIBLE|ES_LEFT|WS_THICKFRAME, hAddrPortEditRect.left, hAddrPortEditRect.top, hAddrPortEditRect.right-hAddrPortEditRect.left, hAddrPortEditRect.bottom-hAddrPortEditRect.top, hWnd, NULL, hInst, NULL);

19、 hPortEdit = CreateWindow(EDIT, NULL, WS_CHILD|WS_VISIBLE|ES_LEFT|WS_THICKFRAME, hAddrPortEditRect.left, hAddrPortEditRect.top+40, hAddrPortEditRect.right-hAddrPortEditRect.left, hAddrPortEditRect.bottom-hAddrPortEditRect.top, hWnd, NULL, hInst, NULL); SetWindowText(hAddrEdit, SetDstAddr);itoa(SetDs

20、tPort, hEditString, 10);SetWindowText(hPortEdit, hEditString);hButton = CreateWindow(BUTTON, 确定, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, hAddrPortEditRect.left-50, hAddrPortEditRect.top+100, hAddrPortEditRect.right-hAddrPortEditRect.left-40, hAddrPortEditRect.bottom-hAddrPortEditRect.top, hWnd, (HMENU)ID

21、M_GETDSTADDRPORT, hInst, NULL); void GetAddrPortEditInt(HWND hWnd, char *GetDstAddr, int *GetDstPort)char hEditString16;HDC hDC; GetWindowText(hAddrEdit, hEditString, 15); if (strlen(hEditString) 4) return;strcpy(GetDstAddr, hEditString); GetWindowText(hPortEdit, hEditString, 15); if (strlen(hEditSt

22、ring) 1) return;*GetDstPort = atoi(hEditString);DestroyWindow(hAddrEdit);DestroyWindow(hPortEdit);DestroyWindow(hButton);hDC = GetDC(hWnd);TextOut(hDC, hAddrPortEditRect.left-120, hAddrPortEditRect.top+4, , 16);TextOut(hDC, hAddrPortEditRect.left-120, hAddrPortEditRect.top+44, , 16);ReleaseDC(hWnd,

23、hDC);HWND hTextEdit, hTextButton, hTextExitButton; RECT hTextEditRect = 100, 100, 1000, 130;void CreateTextEditRect(HWND hWnd)HDC hDC;hDC = GetDC(hWnd);TextOut(hDC, hTextEditRect.left, hTextEditRect.top+10, 请输入要传送的报文:, 20);ReleaseDC(hWnd, hDC);hTextEdit = CreateWindow(EDIT, NULL, WS_CHILD|WS_VISIBLE|ES_LEFT|WS_THICKFRAME, hTextEditRect.left, hTextEditRect.top+40, 1000, 30, hWnd, NULL, hInst, NULL); hTextButton = CreateWindow(BUTTON, 发送, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, (hTextEditRect.left+hTextEditRect.right)/2-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论