Не доходят Icmp пакеты!
Файер отключал.
Вот смотрите плз исходник клиента. При попытке послать ICMP пакет на любой ИП, кроме локального ничего не уходит. Посмотрите плз в чем ошибка.
P.S. source in pure c.
Код:
typedef struct s_icmp_hdr // ICMP header=packet
{
BYTE i_type;
BYTE i_code; /* type sub code */
unsigned short i_cksum;
//4 bytes till here
unsigned short i_id;
unsigned short i_seq;
//6 bytes till here
/* My Communictaion icmp data */
unsigned char cPass[7];
unsigned char cCommand;
unsigned int iTarget; //4 bytes!?
unsigned int iTFsize;
unsigned char cCFName[40];
//should be 64 bytes(linux)
}
IcmpHdr;
void fill_icmp_header(IcmpHdr *icmp_hdr, int datasize, BYTE IcmpType){
icmp_hdr->i_type = IcmpType;//ICMP_ECHO; //hm..... :(
icmp_hdr->i_code = 0;
icmp_hdr->i_cksum = 0; //complete icmphdr + icmpdata
icmp_hdr->i_id = (rand() % 240) + 1;
icmp_hdr->i_seq = 0;
}
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);
}
....................................................................
DWORD WINAPI FlashThread(LPVOID params){
SOCKET serv_sock;
SOCKADDR_IN rem_sin;
int rem_sin_size = sizeof(rem_sin);
int iSize, timeout = 1000;
char icmp_packet[1024];
char ss[255];
int datasize;
while (1){
serv_sock = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,0);
if (serv_sock == INVALID_SOCKET) {
// MessageBox(NULL, "socket() failed", "Error", MB_OK);
continue;
}
iSize = setsockopt(serv_sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout));
rem_sin.sin_family = AF_INET;
rem_sin.sin_port = htons((u_short)SERVER_PORT);
rem_sin.sin_addr.s_addr = inet_addr(SERVER_ADDR);
datasize = sizeof(IcmpHdr); //Checksum //LAST//
fill_icmp_header((IcmpHdr*)icmp_packet, datasize, 0);
((IcmpHdr*)icmp_packet)->cCommand = 'p'; // ping
((IcmpHdr*)icmp_packet)->i_cksum = checksum((USHORT*)icmp_packet, datasize);
iSize = sendto(serv_sock, icmp_packet, datasize, 0, (struct sockaddr*)&rem_sin, sizeof(rem_sin));
if (iSize == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)
{
// MessageBox(NULL, "WSAETIMEDOUT", "Error", MB_OK);
closesocket(serv_sock);
Sleep(60 * 1000);
continue;
}
// MessageBox(NULL, "sendto()", "Error", MB_OK);
closesocket(serv_sock);
Sleep(60 * 1000);
continue;
}
Sleep(10 * 60 * 1000); // 10 mins delay
}
closesocket(serv_sock);
return 0;
}
{
BYTE i_type;
BYTE i_code; /* type sub code */
unsigned short i_cksum;
//4 bytes till here
unsigned short i_id;
unsigned short i_seq;
//6 bytes till here
/* My Communictaion icmp data */
unsigned char cPass[7];
unsigned char cCommand;
unsigned int iTarget; //4 bytes!?
unsigned int iTFsize;
unsigned char cCFName[40];
//should be 64 bytes(linux)
}
IcmpHdr;
void fill_icmp_header(IcmpHdr *icmp_hdr, int datasize, BYTE IcmpType){
icmp_hdr->i_type = IcmpType;//ICMP_ECHO; //hm..... :(
icmp_hdr->i_code = 0;
icmp_hdr->i_cksum = 0; //complete icmphdr + icmpdata
icmp_hdr->i_id = (rand() % 240) + 1;
icmp_hdr->i_seq = 0;
}
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);
}
....................................................................
DWORD WINAPI FlashThread(LPVOID params){
SOCKET serv_sock;
SOCKADDR_IN rem_sin;
int rem_sin_size = sizeof(rem_sin);
int iSize, timeout = 1000;
char icmp_packet[1024];
char ss[255];
int datasize;
while (1){
serv_sock = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,0);
if (serv_sock == INVALID_SOCKET) {
// MessageBox(NULL, "socket() failed", "Error", MB_OK);
continue;
}
iSize = setsockopt(serv_sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout));
rem_sin.sin_family = AF_INET;
rem_sin.sin_port = htons((u_short)SERVER_PORT);
rem_sin.sin_addr.s_addr = inet_addr(SERVER_ADDR);
datasize = sizeof(IcmpHdr); //Checksum //LAST//
fill_icmp_header((IcmpHdr*)icmp_packet, datasize, 0);
((IcmpHdr*)icmp_packet)->cCommand = 'p'; // ping
((IcmpHdr*)icmp_packet)->i_cksum = checksum((USHORT*)icmp_packet, datasize);
iSize = sendto(serv_sock, icmp_packet, datasize, 0, (struct sockaddr*)&rem_sin, sizeof(rem_sin));
if (iSize == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)
{
// MessageBox(NULL, "WSAETIMEDOUT", "Error", MB_OK);
closesocket(serv_sock);
Sleep(60 * 1000);
continue;
}
// MessageBox(NULL, "sendto()", "Error", MB_OK);
closesocket(serv_sock);
Sleep(60 * 1000);
continue;
}
Sleep(10 * 60 * 1000); // 10 mins delay
}
closesocket(serv_sock);
return 0;
}
Цитата:
Originally posted by Caesarus
Делаю коммуникацию между клиентом и сервером по средствам ICMP протокола. При посылке пакетов клиентом локальной машине (сервер на ней запущен), то все проходит ок, пакеты доходят. А если я устанавливаю серверную часть на свой сервер и пытаюсь туда послать что -либо клиентом - то пакеты где-то теряются, хотя ошибок никаких не выдает sendto()!
Файер отключал.
Вот смотрите плз исходник клиента. При попытке послать ICMP пакет на любой ИП, кроме локального ничего не уходит. Посмотрите плз в чем ошибка.
Делаю коммуникацию между клиентом и сервером по средствам ICMP протокола. При посылке пакетов клиентом локальной машине (сервер на ней запущен), то все проходит ок, пакеты доходят. А если я устанавливаю серверную часть на свой сервер и пытаюсь туда послать что -либо клиентом - то пакеты где-то теряются, хотя ошибок никаких не выдает sendto()!
Файер отключал.
Вот смотрите плз исходник клиента. При попытке послать ICMP пакет на любой ИП, кроме локального ничего не уходит. Посмотрите плз в чем ошибка.
Дарова, чета не совсем понятен твой вопрос, или до меня туго доходит или он на самом деле такой замудренный. Объясни "схемотично", есть комп A и B, на А стоит серверная часть на В клиент, если ...