怎样接收发出SYN数据报后,返回的SYN-ACK应答 自己填写了TCP/IP数据包用来扫描端口,那么发出一个SYN 包后应该会有SYN-ACK应答,那么我怎么才能接收呢?只有20分了,不好意思.在这里小弟先谢谢各位大哥了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 connect 就是syn包返回成功就是收到了syn-ack默认connect是尝试3次syn 我创建了原始套接字,自己写IP首部和TCP首部,自己校验,然后发出去,那么目标地址收到我这个数据包之后会应答的,我怎么来接收这个应答呢? 用rawsoacket,接收所有ip包,然后自己过滤一下源代码可以参考这个http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5413很容易实现 这是我以前写的一段代码 SOCKET Socket = socket(AF_INET, SOCK_RAW, IPPROTO_IP); if(INVALID_SOCKET == Socket) { m_pReceiver->OnError(m_dwIP, RSST_ERROR_CREATESOCKETFAIL, WSAGetLastError()); return -1; } int rcvtimeo = 100; if(setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&rcvtimeo, sizeof(rcvtimeo)) == SOCKET_ERROR) { m_pReceiver->OnError(m_dwIP, RSST_ERROR_SETTIMEOUTFAIL, WSAGetLastError()); closesocket(Socket); return -1; } SOCKADDR_IN sa; sa.sin_family = AF_INET; sa.sin_addr.s_addr = m_dwIP; if (bind(Socket, (PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR) { m_pReceiver->OnError(m_dwIP, RSST_ERROR_BINDIPFAIL, WSAGetLastError()); closesocket(Socket); return -1; } DWORD dwInBuffer = 1; DWORD dwBytesReturned; if (SOCKET_ERROR == WSAIoctl(Socket, SIO_RCVALL, &dwInBuffer, sizeof(dwInBuffer), NULL, 0, &dwBytesReturned , NULL, NULL)) { m_pReceiver->OnError(m_dwIP, RSST_ERROR_SETRCVALLFAIL, WSAGetLastError()); closesocket(Socket); return -1; } char ReceiveBuffer[0xFFFF]; int nTotalLen = 0; while (WaitForSingleObject(m_hStopEvent, 0) == WAIT_TIMEOUT) { int nReceivedBytes = recv(Socket, ReceiveBuffer, sizeof(ReceiveBuffer), 0); if (SOCKET_ERROR == nReceivedBytes) { int nError = WSAGetLastError(); if (WSAETIMEDOUT == nError) continue; else { m_pReceiver->OnError(m_dwIP, RSST_ERROR_RECEIVEFAIL, WSAGetLastError()); closesocket(Socket); return -1; } } if (nReceivedBytes < 20) { m_pReceiver->OnError(m_dwIP, RSST_ERROR_RCVLENLESSTHEN20, nReceivedBytes); closesocket(Socket); return -1; } if (nReceivedBytes != ntohs(*(WORD*)(ReceiveBuffer+2))) { m_pReceiver->OnError(m_dwIP, RSST_ERROR_RCVLENUNEQUALTOPKLEN, nReceivedBytes<<16 | ntohs(*(WORD*)(ReceiveBuffer+2))); closesocket(Socket); return -1; } m_pReceiver->OnReceived(ReceiveBuffer, nReceivedBytes); } closesocket(Socket); 如果不把winsock2.h中的#define WSAAPI FAR PASCALtypedef struct _OVERLAPPED* LPWSAOVERLAPPED;typedef void (CALLBACK * LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags);intWSAAPIWSAIoctl(SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);拷过来的话,WSAIoctl函数提示为error C2065: 'WSAIoctl' : undeclared identifier想问一下你是怎么用的,还有你介绍的下载源码#include "mstcpip.h"#include "iphlpapi.h"两个头文件找不到,你是怎么编译成功的阿?还有SIO_RCVALL,在那些头文件里找不到,在MSDN里也找不到,你是怎么定义的阿? 现在知道了,他改了AfxSock.h中的winsock.h变成winsock2.h了,嘿嘿,刚才没看他的说明 如何向qq的验证窗口发送文本、数字 一起玩咯~~灰常简单 可不可以在程序中加载MSCOMM32.ocx这个dll然后使用? 如何调用另一线程的COM接口 CSDN别人帮了我怎么给他分啊,好内疚 VC程序不能正常退出 求串口通信代码 如何在程序一开始就能同时打开5个MDI子窗口? 对于QQ登录验证的疑问 谁能详细告诉我MDI程序运行的过程 如何用IDL接口文件反身生产VC所要用的接口? 我在做TCPSYN端口扫描时碰到一个问题
返回成功就是收到了syn-ack
默认connect是尝试3次syn
源代码可以参考这个
http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5413
很容易实现
SOCKET Socket = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if(INVALID_SOCKET == Socket)
{
m_pReceiver->OnError(m_dwIP, RSST_ERROR_CREATESOCKETFAIL, WSAGetLastError());
return -1;
} int rcvtimeo = 100;
if(setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&rcvtimeo, sizeof(rcvtimeo)) == SOCKET_ERROR)
{
m_pReceiver->OnError(m_dwIP, RSST_ERROR_SETTIMEOUTFAIL, WSAGetLastError());
closesocket(Socket);
return -1;
} SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = m_dwIP;
if (bind(Socket, (PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
{
m_pReceiver->OnError(m_dwIP, RSST_ERROR_BINDIPFAIL, WSAGetLastError());
closesocket(Socket);
return -1;
} DWORD dwInBuffer = 1;
DWORD dwBytesReturned;
if (SOCKET_ERROR == WSAIoctl(Socket, SIO_RCVALL, &dwInBuffer, sizeof(dwInBuffer), NULL, 0, &dwBytesReturned , NULL, NULL))
{
m_pReceiver->OnError(m_dwIP, RSST_ERROR_SETRCVALLFAIL, WSAGetLastError());
closesocket(Socket);
return -1;
} char ReceiveBuffer[0xFFFF]; int nTotalLen = 0; while (WaitForSingleObject(m_hStopEvent, 0) == WAIT_TIMEOUT)
{
int nReceivedBytes = recv(Socket, ReceiveBuffer, sizeof(ReceiveBuffer), 0);
if (SOCKET_ERROR == nReceivedBytes)
{
int nError = WSAGetLastError();
if (WSAETIMEDOUT == nError)
continue;
else
{
m_pReceiver->OnError(m_dwIP, RSST_ERROR_RECEIVEFAIL, WSAGetLastError());
closesocket(Socket);
return -1;
}
} if (nReceivedBytes < 20)
{
m_pReceiver->OnError(m_dwIP, RSST_ERROR_RCVLENLESSTHEN20, nReceivedBytes);
closesocket(Socket);
return -1;
} if (nReceivedBytes != ntohs(*(WORD*)(ReceiveBuffer+2)))
{
m_pReceiver->OnError(m_dwIP, RSST_ERROR_RCVLENUNEQUALTOPKLEN, nReceivedBytes<<16 | ntohs(*(WORD*)(ReceiveBuffer+2)));
closesocket(Socket);
return -1;
} m_pReceiver->OnReceived(ReceiveBuffer, nReceivedBytes);
} closesocket(Socket);
typedef struct _OVERLAPPED* LPWSAOVERLAPPED;
typedef void
(CALLBACK * LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwError,
DWORD cbTransferred,
LPWSAOVERLAPPED lpOverlapped,
DWORD dwFlags);
int
WSAAPI
WSAIoctl(SOCKET s,
DWORD dwIoControlCode,
LPVOID lpvInBuffer,
DWORD cbInBuffer,
LPVOID lpvOutBuffer,
DWORD cbOutBuffer,
LPDWORD lpcbBytesReturned,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);拷过来的话,WSAIoctl函数提示为error C2065: 'WSAIoctl' : undeclared identifier
想问一下你是怎么用的,还有你介绍的下载源码
#include "mstcpip.h"
#include "iphlpapi.h"
两个头文件找不到,你是怎么编译成功的阿?
还有SIO_RCVALL,在那些头文件里找不到,在MSDN里也找不到,你是怎么定义的阿?