I am using the following piece of code for performing a connectionless packet sending to a remote server. The domain' s IP is found by pinging it with cmd. However, the sendto() function fails, whereas 0 socket error code is returned. As I cannot spot any mistake, could you please help me fix it?
Code:
IPHEADER ipHeader;
char szSendbuf[60]={0};
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
SOCKADDR_IN ssin;
memset(&ssin, 0, sizeof(ssin));
ssin.sin_family=AF_INET;
ssin.sin_port=htons(0);
ssin.sin_addr.s_addr=inet_addr(target_ip);
SOCKET ssock;
ssock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
BOOL flag = TRUE;
setsockopt(ssock, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag));
ipHeader.verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=my_ip;
ipHeader.destIP=ssin.sin_addr.s_addr;
tcpHeader.sport=htons((unsigned short)(rand()%1025));
tcpHeader.seq=htonl(0x12345678);
tcpHeader.flags=SYN;
tcpHeader.lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.window=htons(512);
tcpHeader.urg_ptr=0;
tcpHeader.checksum=0;
psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.zero=0;
psdHeader.proto=IPPROTO_TCP;
psdHeader.length=htons((unsigned short)(sizeof(tcpHeader)));
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.checksum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof( ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
if (sendto(ssock, (char *)&szSendBuf, sizeof(szSendBuf), 0, (LPSOCKADDR)&ssin, sizeof(ssin)) == SOCKET_ERROR) {
closesocket(ssock);
printf("Error: %d\n", WSAGetLastError());
}