
| // 启动 Winsock WSAData wsaData; if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0) { cerr << "Failed to find Winsock 2.1 or better." << endl; return 1; } |
| inline word MakeWord(const byte wHigh, const byte wLow) { return ((word)wHigh) << 8 | wLow; } |
| void sock_cleanup() { #ifdef WIN32 sockcount--; if (sockcount == 0) WSACleanup(); #endif } |
| SOCKET sd; // RAW Socket句柄 |
| SOCKET WSASocket(int af, int type, int protocol, LPWSAPROTOCOL_INFO lpProtocolInfo, GROUP g, DWORD dwFlags); |
| sd = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, 0, 0, 0); |
| SOCKET WSAAPI socket( int af, int type, int protocol); |
| SOCKADDR_IN addr_in; addr_in.sin_family = AF_INET; addr_in.sin_port = INADDR_ANY; addr_in.sin_addr.S_un.S_addr = GetLocalIP(); nRetCode = bind(sd, (struct sockaddr*) &addr_in, sizeof(addr_in)); if (SOCKET_ERROR == nRetCode) { printf("BIND Error!%d\n", WSAGetLastError()); } |
| struct sockaddr_in { unsigned short sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; } |
| struct sockaddr { unisgned short as_family; char sa_data[14]; }; |
| typedef struct in_addr { union { struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { u_short s_w1, s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR; |
| int setsockopt( SOCKET s, //套接字句柄 int level, //选项level,如SOL_SOCKET int optname, //选项名,如SO_BROADCAST const char* optval, //选项值buffer指针 int optlen //选项buffer长度 ); |
| //设置 IP 头操作选项 BOOL flag = TRUE; setsockopt(sd, IPPROTO_IP, IP_HDRINCL, (char*) &flag, sizeof(flag); |
| int ioctlsocket( SOCKET s, long cmd, //命令 u_long* argp //命令参数指针 ); |
| u_long iMode = 1; ioctlsocket(sd, SIO_RCVALL, & iMode); //让 sockRaw 接受所有的数据 |