免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3028 | 回复: 6
打印 上一主题 下一主题

检查对方主机是否开机! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-18 10:31 |只看该作者 |倒序浏览
在c语言上实现这个目的
1、可以调用ping命令来检查;我不想用这个
2、还可以自己写一个包发送到对方ip检测,但是我不会,看了ping.c的源代码我也没有搞懂,希望有人给我写个程序,帮个忙啊 谢谢!
tomken 该用户已被删除
2 [报告]
发表于 2003-02-18 11:02 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2003-02-18 13:43 |只看该作者

检查对方主机是否开机!

还有其它办法啊!
改写 ping命令可以吗??

论坛徽章:
0
4 [报告]
发表于 2003-02-18 13:43 |只看该作者

检查对方主机是否开机!

还有其它办法啊!
改写 ping命令可以吗??

论坛徽章:
0
5 [报告]
发表于 2003-02-18 14:06 |只看该作者

检查对方主机是否开机!

可以用这个命令吗:
  1. sendto(int sockfd, void *buff, size nbytes, int flags, const struct sockaddr *to, socklen_t *addrlen);
复制代码

  1. if ( sendto(sock, buf, 64, 0, (struct sockaddr *)&it,sizeof(it) ) < 0)
  2.          {  
  3.       perror("send failed");  
  4.       exit(6);  
  5.       }  
复制代码

我不知道这个sockaddr 怎么定义的,可以帮个忙吗?
我现在想检查10.156.10 .1是不是开机,不知道现在怎么写!

论坛徽章:
0
6 [报告]
发表于 2003-02-18 14:52 |只看该作者

检查对方主机是否开机!

不可以
因为上面那个是UDP

便是如果对方的端口没有打开的话也会出错

所以最好还是使用icmp包检测

使用arp也可以

论坛徽章:
0
7 [报告]
发表于 2003-02-18 14:54 |只看该作者

检查对方主机是否开机!

以下是一个实现的源码
可以根据自己需要进行修改

  1. //
  2. // PING.C -- Ping program using ICMP and RAW Sockets
  3. //

  4. #include <stdio.h>;
  5. #include <stdlib.h>;
  6. #include <winsock.h>;

  7. #include "ping.h"

  8. // Internal Functions
  9. void Ping(LPCSTR pstrHost);
  10. void ReportError(LPCSTR pstrFrom);
  11. int  WaitForEchoReply(SOCKET s);
  12. u_short in_cksum(u_short *addr, int len);

  13. // ICMP Echo Request/Reply functions
  14. int                SendEchoRequest(SOCKET, LPSOCKADDR_IN);
  15. DWORD        RecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char *);


  16. // main()
  17. void main(int argc, char **argv)
  18. {
  19.     WSADATA wsaData;
  20.     WORD wVersionRequested = MAKEWORD(1,1);
  21.     int nRet;

  22.         // Check arguments
  23.     if (argc != 2)
  24.     {
  25.                 fprintf(stderr,"\nUsage: ping hostname\n");
  26.                 return;
  27.     }

  28.         // Init WinSock
  29.     nRet = WSAStartup(wVersionRequested, &wsaData);
  30.     if (nRet)
  31.     {
  32.                 fprintf(stderr,"\nError initializing WinSock\n");
  33.                 return;
  34.     }

  35.         // Check version
  36.         if (wsaData.wVersion != wVersionRequested)
  37.         {
  38.                 fprintf(stderr,"\nWinSock version not supported\n");
  39.                 return;
  40.         }

  41.         // Go do the ping
  42.         Ping(argv[1]);

  43.         // Free WinSock
  44.     WSACleanup();
  45. }


  46. // Ping()
  47. // Calls SendEchoRequest() and
  48. // RecvEchoReply() and prints results
  49. void Ping(LPCSTR pstrHost)
  50. {
  51.         SOCKET          rawSocket;
  52.         LPHOSTENT lpHost;
  53.         struct    sockaddr_in saDest;
  54.         struct    sockaddr_in saSrc;
  55.         DWORD          dwTimeSent;
  56.         DWORD          dwElapsed;
  57.         u_char    cTTL;
  58.         int       nLoop;
  59.         int       nRet;

  60.         // Create a Raw socket
  61.         rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
  62.         if (rawSocket == SOCKET_ERROR)
  63.         {
  64.                 ReportError("socket()");
  65.                 return;
  66.         }
  67.        
  68.         // Lookup host
  69.         lpHost = gethostbyname(pstrHost);
  70.         if (lpHost == NULL)
  71.         {
  72.                 fprintf(stderr,"\nHost not found: %s\n", pstrHost);
  73.                 return;
  74.         }
  75.        
  76.         // Setup destination socket address
  77.         saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->;h_addr));
  78.         saDest.sin_family = AF_INET;
  79.         saDest.sin_port = 0;

  80.         // Tell the user what we're doing
  81.         printf("\nPinging %s [%s] with %d bytes of data:\n",
  82.                                 pstrHost,
  83.                                 inet_ntoa(saDest.sin_addr),
  84.                                 REQ_DATASIZE);

  85.         // Ping multiple times
  86.         for (nLoop = 0; nLoop < 4; nLoop++)
  87.         {
  88.                 // Send ICMP echo request
  89.                 SendEchoRequest(rawSocket, &saDest);

  90.                 // Use select() to wait for data to be received
  91.                 nRet = WaitForEchoReply(rawSocket);
  92.                 if (nRet == SOCKET_ERROR)
  93.                 {
  94.                         ReportError("select()");
  95.                         break;
  96.                 }
  97.                 if (!nRet)
  98.                 {
  99.                         printf("\nTimeOut");
  100.                         break;
  101.                 }

  102.                 // Receive reply
  103.                 dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);

  104.                 // Calculate elapsed time
  105.                 dwElapsed = GetTickCount() - dwTimeSent;
  106.                 printf("\nReply from: %s: bytes=%d time=%ldms TTL=%d",
  107.                inet_ntoa(saSrc.sin_addr),
  108.                            REQ_DATASIZE,
  109.                dwElapsed,
  110.                cTTL);
  111.         }
  112.         printf("\n");
  113.         nRet = closesocket(rawSocket);
  114.         if (nRet == SOCKET_ERROR)
  115.                 ReportError("closesocket()");
  116. }


  117. // SendEchoRequest()
  118. // Fill in echo request header
  119. // and send to destination
  120. int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)
  121. {
  122.         static ECHOREQUEST echoReq;
  123.         static nId = 1;
  124.         static nSeq = 1;
  125.         int nRet;

  126.         // Fill in echo request
  127.         echoReq.icmpHdr.Type                = ICMP_ECHOREQ;
  128.         echoReq.icmpHdr.Code                = 0;
  129.         echoReq.icmpHdr.Checksum        = 0;
  130.         echoReq.icmpHdr.ID                        = nId++;
  131.         echoReq.icmpHdr.Seq                        = nSeq++;

  132.         // Fill in some data to send
  133.         for (nRet = 0; nRet < REQ_DATASIZE; nRet++)
  134.                 echoReq.cData[nRet] = ' '+nRet;

  135.         // Save tick count when sent
  136.         echoReq.dwTime                                = GetTickCount();

  137.         // Put data in packet and compute checksum
  138.         echoReq.icmpHdr.Checksum = in_cksum((u_short *)&echoReq, sizeof(ECHOREQUEST));

  139.         // Send the echo request                                                                    
  140.         nRet = sendto(s,                                                /* socket */
  141.                                  (LPSTR)&echoReq,                        /* buffer */
  142.                                  sizeof(ECHOREQUEST),
  143.                                  0,                                                        /* flags */
  144.                                  (LPSOCKADDR)lpstToAddr, /* destination */
  145.                                  sizeof(SOCKADDR_IN));   /* address length */

  146.         if (nRet == SOCKET_ERROR)
  147.                 ReportError("sendto()");
  148.         return (nRet);
  149. }


  150. // RecvEchoReply()
  151. // Receive incoming data
  152. // and parse out fields
  153. DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL)
  154. {
  155.         ECHOREPLY echoReply;
  156.         int nRet;
  157.         int nAddrLen = sizeof(struct sockaddr_in);

  158.         // Receive the echo reply       
  159.         nRet = recvfrom(s,                                        // socket
  160.                                         (LPSTR)&echoReply,        // buffer
  161.                                         sizeof(ECHOREPLY),        // size of buffer
  162.                                         0,                                        // flags
  163.                                         (LPSOCKADDR)lpsaFrom,        // From address
  164.                                         &nAddrLen);                        // pointer to address len

  165.         // Check return value
  166.         if (nRet == SOCKET_ERROR)
  167.                 ReportError("recvfrom()");

  168.         // return time sent and IP TTL
  169.         *pTTL = echoReply.ipHdr.TTL;
  170.         return(echoReply.echoRequest.dwTime);                  
  171. }

  172. // What happened?
  173. void ReportError(LPCSTR pWhere)
  174. {
  175.         fprintf(stderr,"\n%s error: %d\n",
  176.                 WSAGetLastError());
  177. }


  178. // WaitForEchoReply()
  179. // Use select() to determine when
  180. // data is waiting to be read
  181. int WaitForEchoReply(SOCKET s)
  182. {
  183.         struct timeval Timeout;
  184.         fd_set readfds;

  185.         readfds.fd_count = 1;
  186.         readfds.fd_array[0] = s;
  187.         Timeout.tv_sec = 5;
  188.     Timeout.tv_usec = 0;

  189.         return(select(1, &readfds, NULL, NULL, &Timeout));
  190. }


  191. //
  192. // Mike Muuss' in_cksum() function
  193. // and his comments from the original
  194. // ping program
  195. //
  196. // * Author -
  197. // *        Mike Muuss
  198. // *        U. S. Army Ballistic Research Laboratory
  199. // *        December, 1983

  200. /*
  201. *                        I N _ C K S U M
  202. *
  203. * Checksum routine for Internet Protocol family headers (C Version)
  204. *
  205. */
  206. u_short in_cksum(u_short *addr, int len)
  207. {
  208.         register int nleft = len;
  209.         register u_short *w = addr;
  210.         register u_short answer;
  211.         register int sum = 0;

  212.         /*
  213.          *  Our algorithm is simple, using a 32 bit accumulator (sum),
  214.          *  we add sequential 16 bit words to it, and at the end, fold
  215.          *  back all the carry bits from the top 16 bits into the lower
  216.          *  16 bits.
  217.          */
  218.         while( nleft >; 1 )  {
  219.                 sum += *w++;
  220.                 nleft -= 2;
  221.         }

  222.         /* mop up an odd byte, if necessary */
  223.         if( nleft == 1 ) {
  224.                 u_short        u = 0;

  225.                 *(u_char *)(&u) = *(u_char *)w ;
  226.                 sum += u;
  227.         }

  228.         /*
  229.          * add back carry outs from top 16 bits to low 16 bits
  230.          */
  231.         sum = (sum >;>; 16) + (sum & 0xffff);        /* add hi 16 to low 16 */
  232.         sum += (sum >;>; 16);                        /* add carry */
  233.         answer = ~sum;                                /* truncate to 16 bits */
  234.         return (answer);
  235. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP