Socket Program
-
This code keeps on tripping the sendto(); failed if statement. I can't figure this out. Any help is much appreciated. Thank you. void CSSPingDlg::OnPing() { // TODO: Add your control notification handler code here CIPAddressCtrl *ipaddressctrl = (CIPAddressCtrl *) GetDlgItem(IDC_IPADDRESS); CEdit *editbox = (CEdit *) GetDlgItem(IDC_EDIT); byte field1,field2,field3,field4; char ipchar[100]; DWORD dip; WSADATA wsaData; SOCKET sock; static ECHOREQUEST echo_req; struct sockaddr_in sin; ipaddressctrl->GetAddress(field1,field2,field3,field4); sprintf(ipchar, "%d.%d.%d.%d",field1, field2, field3, field4); dip = inet_addr(ipchar); if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { AfxMessageBox("WSAStartup failure!",MB_OK); } if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == SOCKET_ERROR) { AfxMessageBox("Error starting socket",MB_OK); } sin.sin_family = AF_INET; sin.sin_port = htons(0); sin.sin_addr.s_addr = dip; echo_req.icmpHdr.icmp_type = ICMP_ECHOREQ; echo_req.icmpHdr.icmp_code = 0; echo_req.icmpHdr.icmp_cksum = 0; echo_req.icmpHdr.icmp_id = 1; echo_req.icmpHdr.icmp_seq = 1; memset(echo_req.cData, ' ', REQ_DATASIZE); echo_req.icmpHdr.icmp_cksum = checksum((unsigned short *)&echo_req, sizeof(ECHOREQUEST)); if (sendto(sock, (const char *) &echo_req, sizeof(ECHOREQUEST), 0, (SOCKADDR *) dip, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { AfxMessageBox("sendto() failed: %d\n", MB_OK); } closesocket(sock); WSACleanup(); }
-
This code keeps on tripping the sendto(); failed if statement. I can't figure this out. Any help is much appreciated. Thank you. void CSSPingDlg::OnPing() { // TODO: Add your control notification handler code here CIPAddressCtrl *ipaddressctrl = (CIPAddressCtrl *) GetDlgItem(IDC_IPADDRESS); CEdit *editbox = (CEdit *) GetDlgItem(IDC_EDIT); byte field1,field2,field3,field4; char ipchar[100]; DWORD dip; WSADATA wsaData; SOCKET sock; static ECHOREQUEST echo_req; struct sockaddr_in sin; ipaddressctrl->GetAddress(field1,field2,field3,field4); sprintf(ipchar, "%d.%d.%d.%d",field1, field2, field3, field4); dip = inet_addr(ipchar); if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { AfxMessageBox("WSAStartup failure!",MB_OK); } if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == SOCKET_ERROR) { AfxMessageBox("Error starting socket",MB_OK); } sin.sin_family = AF_INET; sin.sin_port = htons(0); sin.sin_addr.s_addr = dip; echo_req.icmpHdr.icmp_type = ICMP_ECHOREQ; echo_req.icmpHdr.icmp_code = 0; echo_req.icmpHdr.icmp_cksum = 0; echo_req.icmpHdr.icmp_id = 1; echo_req.icmpHdr.icmp_seq = 1; memset(echo_req.cData, ' ', REQ_DATASIZE); echo_req.icmpHdr.icmp_cksum = checksum((unsigned short *)&echo_req, sizeof(ECHOREQUEST)); if (sendto(sock, (const char *) &echo_req, sizeof(ECHOREQUEST), 0, (SOCKADDR *) dip, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { AfxMessageBox("sendto() failed: %d\n", MB_OK); } closesocket(sock); WSACleanup(); }
I haven't played with raw sockets or icmp but on a quick scan of your code the use of
(SOCKADDR*)dip
in thesendto
fn looks wrong - don't you mean to use(SOCKADDR*)sin
instead? Phil