- 论坛徽章:
- 0
|
在做嗅探器时为什么以下的代码在vc可以返回真值,在c++builder里返回SOCKET_ERROR,就是说在c++builder里会执行exit(0); 在vc里不会执行进入。\r\n\r\nif (bind(sock, (PSOCKADDR)&saddr, sizeof(saddr)) == SOCKET_ERROR) \r\n { \r\n perror(\"bind\" ; \r\n exit(0); \r\n }\r\n //throw Exception(\"bind error!\" ; \r\n /* \r\n val为输入输出参数,为1时执行,0时取消 \r\n 设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL \r\n 的定义为:#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) \r\n */ \r\n \r\n if (ioctlsocket(sock, SIO_RCVALL, &val) != 0) \r\n { \r\n perror(\"ioctlsocket\" ; \r\n printf(\"error code: %d\\n\", WSAGetLastError()); \r\n exit(0); \r\n } \r\n\r\n\r\n\r\n\r\n具体这个函数:\r\nint get_raw_sock(const char *ipaddr) \r\n { \r\n int sock; \r\n struct sockaddr_in saddr; \r\n int flag = 1; \r\n unsigned long val = 1; \r\n \r\n sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); \r\n if (sock == INVALID_SOCKET) \r\n { \r\n perror(\"socket\" ; \r\n exit(0); \r\n } \r\n //设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理 \r\n if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR) \r\n { \r\n perror(\"setsockopt\" ; \r\n exit(0); \r\n } \r\n saddr.sin_family = AF_INET; \r\n saddr.sin_port = htons(7000); \r\n \r\n\r\n ///ip转换\r\n if (ipaddr) \r\n { \r\n saddr.sin_addr.S_un.S_addr = inet_addr(ipaddr); \r\n } \r\n else \r\n { \r\n saddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); \r\n } \r\n /*\r\n if (bind(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr)) == SOCKET_ERROR) \r\n { \r\n perror(\"bind\" ; \r\n exit(0); \r\n } \r\n */\r\n if (bind(sock, (PSOCKADDR)&saddr, sizeof(saddr)) == SOCKET_ERROR) \r\n { \r\n perror(\"bind\" ; \r\n exit(0); \r\n }\r\n //throw Exception(\"bind error!\" ; \r\n /* \r\n val为输入输出参数,为1时执行,0时取消 \r\n 设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL \r\n 的定义为:#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) \r\n */ \r\n \r\n if (ioctlsocket(sock, SIO_RCVALL, &val) != 0) \r\n { \r\n perror(\"ioctlsocket\" ; \r\n printf(\"error code: %d\\n\", WSAGetLastError()); \r\n exit(0); \r\n } \r\n \r\n return sock; \r\n } |
|