扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
另一个试验,server端创建套接字时,指定协议号为200,client端创建套接字,填充ip头时,都指定协议号为255,结果server端就收不到client端发送的数据了。
当时试验后的笔记:"
server端收数据
client端发数据
server端创建套接字时,指定协议号为255,
client端创建套接字,填充ip头时,都指定协议号为255,
结果server端收到了client端发送的数据。
server端创建套接字时,指定协议号为200,
client端创建套接字,填充ip头时,都指定协议号为255,
结果server端就收不到client端发送的数据了。
多个server端,都使用协议号255,
client端也向255协议发数据,
多个server端,都收到了数据。
"
还有就是,如果程序既发又收的,并且是发往本机的,那么程序会收到自己发出的内容。没说清楚好像,比如吧,一个程序,发255的数据之后,就接收255上的数据,他把数据发往本机,那么它就会收到数据。
rclient:
#include
#include
#include
#include
#include
#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");
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。