用c语言在windows下实现ping命令,求大侠帮帮忙!

kimmy_zhang 2004-11-09 10:55:39
我找到几个程序都是在unix下的实现
而其中的很多头文件在windows下没有,用VC++编译会出错!
大家帮帮忙,再次跪谢!
...全文
483 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicewinds 2004-11-10
  • 打赏
  • 举报
回复
好东西,明天起来贴到VC里试试
oo 2004-11-10
  • 打赏
  • 举报
回复
好象只要Ws2_32.lib这一个就可以了

link的时候说哪个函数找不到,你就去msdn上搜这个函数,
上面会有这个函数需要用到哪个lib的。

睡觉去了,祝好运
kimmy_zhang 2004-11-10
  • 打赏
  • 举报
回复
都有哪些.lib文件,我只知道有个WSOCK32.lib,还要别的么?
oo 2004-11-10
  • 打赏
  • 举报
回复
Ws2_32.lib
kimmy_zhang 2004-11-10
  • 打赏
  • 举报
回复
怎么解决?
好像有外联函数?
找不到?
oo 2004-11-10
  • 打赏
  • 举报
回复
要把几个winsocket的lib加到project里才行的,去查一下msdn吧。
kimmy_zhang 2004-11-10
  • 打赏
  • 举报
回复
编译时出现下面的错误
p.obj : error LNK2001: unresolved external symbol _WSACleanup@0
p.obj : error LNK2001: unresolved external symbol _WSAStartup@8
p.obj : error LNK2001: unresolved external symbol _closesocket@4
p.obj : error LNK2001: unresolved external symbol _inet_ntoa@4
p.obj : error LNK2001: unresolved external symbol _gethostbyname@4
p.obj : error LNK2001: unresolved external symbol _socket@12
p.obj : error LNK2001: unresolved external symbol _sendto@24
p.obj : error LNK2001: unresolved external symbol _recvfrom@24
p.obj : error LNK2001: unresolved external symbol _WSAGetLastError@0
p.obj : error LNK2001: unresolved external symbol _select@20
Debug/p.exe : fatal error LNK1120: 10 unresolved externals
Error executing link.exe.
oo 2004-11-09
  • 打赏
  • 举报
回复
以前从别人帖子上剪下来的,能不能用就不知道了:

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

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

#include "ping.h"

// Internal Functions
void UserPing(LPCSTR pstrHost);
void ReportError(LPCSTR pstrFrom);
int WaitForEchoReply(SOCKET s);
u_short in_cksum(u_short *addr, int len);

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


// main()
void main(int argc, char **argv)
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1,1);
int nRet;

// Check arguments
if(argc != 2){
fprintf(stderr,"\nUsage: ping hostname\n");
return;
}

// Init WinSock
nRet = WSAStartup(wVersionRequested, &wsaData);
if(nRet != 0){
fprintf(stderr,"\nError initializing WinSock\n");
return;
}

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

// Go do the ping
UserPing(argv[1]);

// Free WinSock
WSACleanup();
}


// Ping()
// Calls SendEchoRequest() and
// RecvEchoReply() and prints results
void UserPing(LPCSTR pstrHost)
{
SOCKET rawSocket;
LPHOSTENT lpHost;
struct sockaddr_in saDest;
struct sockaddr_in saSrc;
DWORD dwTimeSent;
DWORD dwElapsed;
u_char cTTL;
int nLoop;
int nRet;

// Create a Raw socket
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if(rawSocket == SOCKET_ERROR){
ReportError("socket()");
return;
}

// Lookup host
lpHost = gethostbyname(pstrHost);
if(lpHost == NULL){
fprintf(stderr,"\nHost not found: %s\n", pstrHost);
return;
}

// Setup destination socket address
saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
saDest.sin_family = AF_INET;
saDest.sin_port = 0;

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

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

// Use select() to wait for data to be received
nRet = WaitForEchoReply(rawSocket);
if (nRet == SOCKET_ERROR){
ReportError("select()");
break;
}
if(!nRet){
printf("\nTimeOut");
break;
}

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

// Calculate elapsed time
dwElapsed = GetTickCount() - dwTimeSent;
printf("\nReply from: %s: bytes=%d time=%ldms TTL=%d",
inet_ntoa(saSrc.sin_addr),
REQ_DATASIZE,
dwElapsed,
cTTL);
}
printf("\n");
nRet = closesocket(rawSocket);
if (nRet == SOCKET_ERROR)
ReportError("closesocket()");
}

// SendEchoRequest()
// Fill in echo request header
// and send to destination
int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)
{
static ECHOREQUEST echoReq;
static nId = 1;
static nSeq = 1;
int nRet;

// Fill in echo request
echoReq.icmpHdr.Type = ICMP_ECHOREQ;
echoReq.icmpHdr.Code = 0;
echoReq.icmpHdr.Checksum = 0;
echoReq.icmpHdr.ID = nId++;
echoReq.icmpHdr.Seq = nSeq++;

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

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

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

// Send the echo request
nRet = sendto(s, // socket
(LPSTR)&echoReq, // buffer
sizeof(ECHOREQUEST),
0, // flags
(LPSOCKADDR)lpstToAddr, // destination
sizeof(SOCKADDR_IN)); // address length

if (nRet == SOCKET_ERROR)
ReportError("sendto()");
return (nRet);
}


// RecvEchoReply()
// Receive incoming data
// and parse out fields
DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL)
{
ECHOREPLY echoReply;
int nRet;
int nAddrLen = sizeof(struct sockaddr_in);

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

// Check return value
if (nRet == SOCKET_ERROR)
ReportError("recvfrom()");

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

// What happened?
void ReportError(LPCSTR pWhere)
{
fprintf(stderr,"\n%s error: %d\n",
WSAGetLastError());
}


// WaitForEchoReply()
// Use select() to determine when
// data is waiting to be read
int WaitForEchoReply(SOCKET s)
{
struct timeval Timeout;
fd_set readfds;

readfds.fd_count = 1;
readfds.fd_array[0] = s;
Timeout.tv_sec = 5;
Timeout.tv_usec = 0;

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


//
// Mike Muuss' in_cksum() function
// and his comments from the original
// ping program
//
// * Author -
// * Mike Muuss
// * U. S. Army Ballistic Research Laboratory
// * December, 1983

//
// I N _ C K S U M
//
// Checksum routine for Internet Protocol family headers (C Version)
//
//
u_short in_cksum(u_short *addr, int len)
{
register int nleft = len;
register u_short *w = addr;
register u_short answer;
register int sum = 0;

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

// mop up an odd byte, if necessary
if( nleft == 1 ) {
u_short u = 0;
*(u_char *)(&u) = *(u_char *)w ;
sum += u;
}

//
// add back carry outs from top 16 bits to low 16 bits
//
sum = (sum >> 16) + (sum & 0xffff); // add hi 16 to low 16
sum += (sum >> 16); // add carry
answer = ~sum; // truncate to 16 bits
return (answer);
}

//
// Ping.h
//

#pragma pack(1)

#define ICMP_ECHOREPLY 0
#define ICMP_ECHOREQ 8

// IP Header -- RFC 791
typedef struct tagIPHDR
{
u_char VIHL; // Version and IHL
u_char TOS; // Type Of Service
short TotLen; // Total Length
short ID; // Identification
short FlagOff; // Flags and Fragment Offset
u_char TTL; // Time To Live
u_char Protocol; // Protocol
u_short Checksum; // Checksum
struct in_addr iaSrc; // Internet Address - Source
struct in_addr iaDst; // Internet Address - Destination
}IPHDR, *PIPHDR;


// ICMP Header - RFC 792
typedef struct tagICMPHDR
{
u_char Type; // Type
u_char Code; // Code
u_short Checksum; // Checksum
u_short ID; // Identification
u_short Seq; // Sequence
char Data; // Data
}ICMPHDR, *PICMPHDR;


#define REQ_DATASIZE 32 // Echo Request Data size

// ICMP Echo Request
typedef struct tagECHOREQUEST
{
ICMPHDR icmpHdr;
DWORD dwTime;
char cData[REQ_DATASIZE];
}ECHOREQUEST, *PECHOREQUEST;


// ICMP Echo Reply
typedef struct tagECHOREPLY
{
IPHDR ipHdr;
ECHOREQUEST echoRequest;
char cFiller[256];
}ECHOREPLY, *PECHOREPLY;


#pragma pack()
kimmy_zhang 2004-11-09
  • 打赏
  • 举报
回复
你还真能偷懒阿!
这是什么啊?
我晕!
大哥,我急用,帮帮忙阿
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
找了个偷懒的办法,^_^
zhangfjj 2004-11-09
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int main()
{
system("ping 17.6.1.5");
return 0;
}

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧