扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
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;
}
rserver:
#include
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
void RawServer();
void main()
{
WSADATA wsaData;
WSAStartup(0x0202, &wsaData);
RawServer();
WSACleanup();
}
//////////////////////////////////////////////////////////
void RawServer()
{
int nRet;
SOCKET theSocket;
theSocket = socket(AF_INET, SOCK_RAW, 255);
if (theSocket == INVALID_SOCKET)
{
printf("socket() error\n");
return;
}
SOCKADDR_IN saServer;
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock assign address
saServer.sin_port = 0; // Use port passed from user
nRet = bind(theSocket, // Socket deScriptor
(LPSOCKADDR)&saServer, // Address to bind to
sizeof(struct sockaddr) // Size of address
);
if (nRet == SOCKET_ERROR)
{
printf("bind() error\n");
closesocket(theSocket);
return;
}
///////////////////////////////////////////////////
int nLen;
nLen = sizeof(SOCKADDR);
char szBuf[1024];
nRet = gethostname(szBuf, sizeof(szBuf));
if (nRet == SOCKET_ERROR)
{
printf("gethostname() error\n");
closesocket(theSocket);
return;
}
LPHOSTENT lpHostEntry;
lpHostEntry = gethostbyname(szBuf);
printf("Server named %s addr %s \n\n",
szBuf, inet_ntoa(*(LPIN_ADDR)lpHostEntry->h_addr));
///////////////////////////////////////////////////
SOCKADDR_IN saClient;
memset(szBuf, 0, sizeof(szBuf));
nRet = recvfrom(theSocket, // Bound socket
szBuf, // Receive buffer
sizeof(szBuf), // Size of buffer in bytes
0, // Flags
(struct sockaddr*)&saClient, // Buffer to receive client address
&nLen); // Length of client address buffer
if(nRet!=SOCKET_ERROR)
{
printf("Server recv: %s\n",szBuf+20);
}
else
{
printf("recv error: %d\n",WSAGetLastError());
closesocket(theSocket);
return;
}
getch();
closesocket(theSocket);
return;
}
使用Jiurl255进行数据传输明显是没有tcp和udp的端口的,这样也就不会被 netstat -an 之类的命令看到。这和利用icmp传输数据很象,但是我觉得Jiurl255比用icmp传数据要来的好一些。它还有个比较大的缺点就是,由于直接使用的是ip,所以传输的数据是有可能丢失的,这是我观察后写的笔记:"使用ip,ip头字段中的上层协议填255,这是一个还没有人用的协议号。然后在网络中两个主机上分别运行c,s程序,c发送ip255报文,内容hello n,共发50个,每秒发一个。s收ip255报文,确实收到,一次测试中,50个报文,收到了49个,也确实存在ip报丢失的情况。两个方向上都试了,是可行的。"
因此用此方法隐藏端口是要多费不少力气的,我自己写的一个程序中,传送文件使用了一些简单的等待ack,超时重发的机制保证数据不会丢失和发生错误,传送命令,没有保证不会丢失。有时间的话,准备写个保证不丢失,不错误的收发函数。传送文件用的那些机制,参考了使用udp协议进行文件可靠传输的tftp协议。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者