windows下带超时的telnet探测IP和端口
生活随笔
收集整理的這篇文章主要介紹了
windows下带超时的telnet探测IP和端口
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? 玩樹莓派由于沒有屏幕,IP可能會跳,這時就不知道自己的樹莓派是哪個IP了,下面可以用這個程序去探測自己樹莓派的IP。其主要思想是:非阻塞的帶超時的connect函數(shù)。
?
#include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int telnet_test_tcp(char *ip,int port,int timeout) { // 網(wǎng)絡初始化 WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); WSAStartup( wVersionRequested, &wsaData ); // 創(chuàng)建客戶端socket(默認為是阻塞socket) SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); // 設置為非阻塞的socket int iMode = 1; ioctlsocket(sockClient, FIONBIO, (u_long FAR*)&iMode); // 定義服務端 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr(ip); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(port); // 超時時間 struct timeval tm; tm.tv_sec = timeout; tm.tv_usec = 0; int ret = -1; // 嘗試去連接服務端 if (-1 != connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))) { ret = 1; // 連接成功 } else { //select過程fd_set wset,rset; FD_ZERO(&wset);FD_ZERO(&rset);FD_SET(sockClient, &wset);FD_SET(sockClient, &rset);int n = select(-1, &rset, &wset, NULL, &tm);if (n < 0) { ret = -1; // select錯誤 } else if(n == 0){ret = -2;//select超時}else if(n == 1){ if(FD_ISSET(sockClient,&wset)){ret = 0; }else{ret = -3;}} else //其他問題{ret = -4;}} iMode = 0; ioctlsocket(sockClient, FIONBIO, (u_long FAR*)&iMode); //設置為阻塞模式 // connect狀態(tài) if(ret == 0){printf("%s, %d ---------->ok\n",ip,port);}else{printf("%s, %d error\n",ip,port); }// 釋放網(wǎng)絡連接 closesocket(sockClient); WSACleanup(); return 0; } int main() {char ip[20];int i=1;for(i=1;i<=255;i++){sprintf(ip,"192.168.1.%d",i);telnet_test_tcp(ip,22,1);}return 0; }經(jīng)測試,可用。
?
關于select和非阻塞connect的以下2個規(guī)則:1)當連接成功建立時,描述符變?yōu)榭蓪? 2)當連接遇到錯誤時,描述符變?yōu)榧纯勺x又可寫
?
?
linux版本可參考:http://blog.csdn.net/stpeace/article/details/78835802
總結
以上是生活随笔為你收集整理的windows下带超时的telnet探测IP和端口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getservbyname和getser
- 下一篇: linux下多线程实现服务端