怎样接收发出SYN数据报后,返回的SYN-ACK应答

nbczhouyi 2004-12-22 08:53:21
自己填写了TCP/IP数据包用来扫描端口,那么发出一个SYN 包后应该会有SYN-ACK应答,那么我怎么才能接收呢?
只有20分了,不好意思.在这里小弟先谢谢各位大哥了
...全文
245 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nb_zhouyi 2005-01-20
  • 打赏
  • 举报
回复
nbczhouyi 2004-12-22
  • 打赏
  • 举报
回复
现在知道了,他改了AfxSock.h中的winsock.h变成winsock2.h了,嘿嘿,刚才没看他的说明
nbczhouyi 2004-12-22
  • 打赏
  • 举报
回复
如果不把winsock2.h中的

#define WSAAPI FAR PASCAL
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里也找不到,你是怎么定义的阿?
nbczhouyi 2004-12-22
  • 打赏
  • 举报
回复
SIO_RCVALL,你是怎么定义的阿?
iq199 2004-12-22
  • 打赏
  • 举报
回复
这是我以前写的一段代码
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);
iq199 2004-12-22
  • 打赏
  • 举报
回复
用rawsoacket,接收所有ip包,然后自己过滤一下
源代码可以参考这个
http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5413
很容易实现
nbczhouyi 2004-12-22
  • 打赏
  • 举报
回复
我创建了原始套接字,自己写IP首部和TCP首部,自己校验,然后发出去,那么目标地址收到我这个数据包之后会应答的,我怎么来接收这个应答呢?
shoooo 2004-12-22
  • 打赏
  • 举报
回复
connect 就是syn包
返回成功就是收到了syn-ack
默认connect是尝试3次syn

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧