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

📄 rclient.cpp

📁 关于win2000核心编程的文章
💻 CPP
字号:
/***************************************************************|
                        Author:   JIURL
						Email:    jiurl@mail.china.com
						Homepage: http://jiurl.yeah.net
/***************************************************************/
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <ws2tcpip.h> 
#include <conio.h>

#pragma comment(lib,"ws2_32.lib")


typedef struct ip_hdr                //定义IP首部
{
    unsigned char    h_verlen;        //4位首部长度,4位IP版本号
    unsigned char    tos;            //8位服务类型TOS
    unsigned short    total_len;        //16位总长度(字节)
    unsigned short    ident;            //16位标识
    unsigned short    frag_and_flags;    //3位标志位
    unsigned char    ttl;            //8位生存时间 TTL
    unsigned char    proto;            //8位协议 (TCP, UDP 或其他)
    unsigned short    checksum;        //16位IP首部校验和
    unsigned int    sourceIP;        //32位源IP地址
    unsigned int    destIP;            //32位目的IP地址
}IP_HEADER, *PIP_HEADER;


USHORT CheckSum(USHORT *buffer, int size);

void RawClient( char *szServer );


void main()
{
	WSADATA wsaData;

	char ServerAddr[256];

	printf("Server Addr : ");
	scanf("%s",ServerAddr);
	printf("\n");

	WSAStartup(0x0202, &wsaData);

	RawClient(ServerAddr);

	WSACleanup();
}

/////////////////////////////////////////////////
USHORT CheckSum(USHORT *buffer, int size)
{
    unsigned long cksum=0;

    while (size > 1)
    {
        cksum += *buffer++;
        size  -= sizeof(USHORT);   
    }
    if (size)
    {
        cksum += *(UCHAR*)buffer;   
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16); 

    return (USHORT)(~cksum); 
}

//////////////////////////////////////////////////////////
void RawClient( char *szServer )
{
	LPHOSTENT lpHostEntry;

	lpHostEntry = gethostbyname(szServer);
    if (lpHostEntry == NULL)
    {
        printf("gethostbyname() error\n");
        return;
    }

	SOCKET theSocket;

	theSocket = socket(AF_INET, SOCK_RAW, 255);
	if (theSocket == INVALID_SOCKET)
	{
		printf("socket() error\n");
		return;
	}

	int nRet;
	BOOL optval;

	optval=TRUE;
	nRet = setsockopt(theSocket, IPPROTO_IP, IP_HDRINCL, (char*)&optval, sizeof(optval));
	if (SOCKET_ERROR == nRet)
    {
        printf("SetSockOpt Error!%d\n", WSAGetLastError());
        return;
    }

	SOCKADDR_IN saServer;

	saServer.sin_family = AF_INET;
	saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); // Let WinSock assign address
	saServer.sin_port = 0;	   // Use port passed from user

	char szBuf[1024];

//////////////////////////////////////////////////////////////////
	memset(szBuf, 0, sizeof(szBuf));

	int IpHdrLen=0;
	int DataLen=0;

	IP_HEADER *pIpHdr=NULL;
	char* pData=NULL;

	IpHdrLen=sizeof(IP_HEADER);

	pIpHdr=(IP_HEADER*)szBuf;

	pIpHdr->h_verlen=(4<<4)| (sizeof(IP_HEADER) / sizeof(unsigned long));
	pIpHdr->tos=0;
	pIpHdr->proto=255;
	pIpHdr->ttl=128;
	pIpHdr->ident=0;
	pIpHdr->checksum=0;
	pIpHdr->frag_and_flags=0;
	pIpHdr->sourceIP=inet_addr("1.1.1.1");
	pIpHdr->destIP=(unsigned int)saServer.sin_addr.s_addr;

	pData=(szBuf+IpHdrLen);
	printf("Type a String :");
	scanf("%s",pData);
	DataLen=strlen(pData);

	pIpHdr->total_len=IpHdrLen+DataLen;

//////////////////////////////////////////////////////////////////
	nRet = sendto(theSocket,				// Socket
				  szBuf,					// Data buffer
				  IpHdrLen+DataLen,			// Length of data
				  0,						// Flags
				  (LPSOCKADDR)&saServer,	// Server address
				  sizeof(struct sockaddr)); // Length of address
	if(nRet!=SOCKET_ERROR)
	{
		printf("Client send: %s\n",pData);
	}

	getch();
	closesocket(theSocket);
	return;
}

⌨️ 快捷键说明

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