自己填写了TCP/IP数据包用来扫描端口,那么发出一个SYN 包后应该会有SYN-ACK应答,那么我怎么才能接收呢?
只有20分了,不好意思.在这里小弟先谢谢各位大哥了

解决方案 »

  1.   

    connect 就是syn包
    返回成功就是收到了syn-ack
    默认connect是尝试3次syn
      

  2.   

    我创建了原始套接字,自己写IP首部和TCP首部,自己校验,然后发出去,那么目标地址收到我这个数据包之后会应答的,我怎么来接收这个应答呢?
      

  3.   

    用rawsoacket,接收所有ip包,然后自己过滤一下
    源代码可以参考这个
    http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5413
    很容易实现
      

  4.   

    这是我以前写的一段代码
    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);
      

  5.   

    如果不把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里也找不到,你是怎么定义的阿?
      

  6.   

    现在知道了,他改了AfxSock.h中的winsock.h变成winsock2.h了,嘿嘿,刚才没看他的说明