首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

winpcap的例子编译不了啊哪位高手帮小弟我看看

2012-02-26 
winpcap的例子编译不了啊,谁帮我看看// 1.cpp : 定义控制台应用程序的入口点。//#include stdafx.h#inclu

winpcap的例子编译不了啊,谁帮我看看
// 1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "pcap.h"
#include "remote-ext.h"  

#ifndef WIN32
  #include <sys/socket.h>
  #include <netinet/in.h>
#else
  #include <winsock.h>
#endif


// 函数原型
void ifprint(pcap_if_t *d);
char *iptos(u_long in);
char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen);

int _tmain(int argc, _TCHAR* argv[])
{
pcap_if_t *alldevs;
  pcap_if_t *d;
  char errbuf[PCAP_ERRBUF_SIZE+1];
  char source[PCAP_ERRBUF_SIZE+1];

  printf("Enter the device you want to list:\n"
  "rpcap:// ==> lists interfaces in the local machine\n"
  "rpcap://hostname:port ==> lists interfaces in a remote machine\n"
  " (rpcapd daemon must be up and running\n"
  " and it must accept 'null' authentication)\n"
  "file://foldername ==> lists all pcap files in the give folder\n\n"
  "Enter your choice: ");

  fgets(source, PCAP_ERRBUF_SIZE, stdin);
  source[PCAP_ERRBUF_SIZE] = '\0';

  /* 获得接口列表 */
  if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1)
  {
  fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
  exit(1);
  }

  /* 扫描列表并打印每一项 */
  for(d=alldevs;d;d=d->next)
  {
  ifprint(d);
  }

  pcap_freealldevs(alldevs);

  return 1;



}

/* 打印所有可用信息 */
void ifprint(pcap_if_t *d)
{
  pcap_addr_t *a;
  char ip6str[128];

  /* 设备名(Name) */
  printf("%s\n",d->name);

  /* 设备描述(Description) */
  if (d->description)
  printf("\tDescription: %s\n",d->description);

  /* Loopback Address*/
  printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");

  /* IP addresses */
  for(a=d->addresses;a;a=a->next) {
  printf("\tAddress Family: #%d\n",a->addr->sa_family);
  
  switch(a->addr->sa_family)
  {
  case AF_INET:
  printf("\tAddress Family Name: AF_INET\n");
  if (a->addr)
  printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
  if (a->netmask)
  printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
  if (a->broadaddr)
  printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
  if (a->dstaddr)
  printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
  break;

  case AF_INET6:
  printf("\tAddress Family Name: AF_INET6\n");
  if (a->addr)
  printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
  break;

  default:
  printf("\tAddress Family Name: Unknown\n");
  break;
  }
  }
  printf("\n");
}



/* 将数字类型的IP地址转换成字符串类型的 */
#define IPTOSBUFFERS 12


char *iptos(u_long in)
{
  static char output[IPTOSBUFFERS][3*4+3+1];
  static short which;
  u_char *p;

  p = (u_char *)&in;
  which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
  sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  return output[which];
}

char * ip6tos(struct sockaddr *sockaddr, char *address, int addrlen)
{
  socklen_t sockaddrlen;

  #ifdef WIN32
  sockaddrlen = sizeof(struct sockaddr_in6);
  #else
  sockaddrlen = sizeof(struct sockaddr_storage);
  #endif


  if(getnameinfo(sockaddr, 
  sockaddrlen, 
  address, 
  addrlen, 
  NULL, 
  0, 
  NI_NUMERICHOST) != 0) address = NULL;

  return address;
}





1>------ 已启动生成: 项目: 1, 配置: Debug Win32 ------
1>正在编译...
1>1.cpp
1>d:\vc2005 project\1\1\1.cpp(120) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(345) : 参见“sprintf”的声明
1>正在链接...
1>1.obj : error LNK2019: 无法解析的外部符号 __imp__getnameinfo@28,该符号在函数 "char * __cdecl ip6tos(struct sockaddr *,char *,int)" (?ip6tos@@YAPADPAUsockaddr@@PADH@Z) 中被引用
1>D:\vc2005 project\1\Debug\1.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>生成日志保存在“file://d:\vc2005 project\1\1\Debug\BuildLog.htm”
1>1 - 2 个错误,1 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========


[解决办法]
#include <wspiapi.h>//getnameinfo 
#pragma comment(lib,"ws2_32.lib") 
,,,window下面的函数所在库

热点排行