我是套接字编程的新手,我试图使用套接字编程ping一台机器。我的代码编译为64位平台。
以下是我正在使用的代码:
SOCKET rawSocket;
struct sockaddr_in saDest;
struct timeval Timeout;
fd_set readfds;
struct addrinfo *result = NULL;
struct addrinfo hints;
DWORD dwRetVal;
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;
dwRetVal = getaddrinfo(pstrHost, NULL, &hints, &result);
saDest.sin_addr.s_addr = ((struct sockaddr_in *)(result->ai_addr))->sin_addr.s_addr;
saDest.sin_family = AF_INET;
saDest.sin_port = 0;
FD_ZERO(&readfds);
FD_SET(rawSocket, &readfds);
Timeout.tv_sec = 5;
Timeout.tv_usec = 0;
select(1, &readfds, NULL, NULL, &Timeout);
一旦我执行select
调用它就会返回错误:"尝试对非套接字"进行操作。错误代码select() error: 10038
关于可能出错的任何想法?
UPDATE 1
:我刚刚拨打connect
之前尝试select
dwRetValue = connect(rawSocket, (SOCKADDR *) & saDest, sizeof(saDest));
并且此调用返回0.