截获所有以太网帧数据并进行具体分析

/* capture_packet.c - 截获所有以太网帧数据并进行具体分析 *//* 常用函数的头文件   */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  
#include <strings.h>
#include <unistd.h>  
#include <signal.h>/* 与网络相关的头文件 */
#include <netinet/ip_icmp.h> 
#include <net/if_arp.h>
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>   
#include <netinet/ip.h>  
#include <netdb.h>  
#include <netinet/tcp.h>  
#include <netinet/udp.h> 
#include <signal.h>  
#include <net/if.h>  
#include <sys/ioctl.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <linux/if_ether.h> 
#include <net/ethernet.h>
#include <linux/igmp.h>
#include <netinet/tcp.h>/* 全局变量结构的结构体原型 - 包含要记录的任何全局信息 */
struct global_info {unsigned int bytes;		/* 网卡接收的总字节数     */unsigned int packet_num;        /* 网卡接受的帧的总数量   */unsigned int packet_arp;        /* 接收到的arp包的数量    */unsigned int packet_rarp;       /* 接收到的rarp包的数量   */unsigned int packet_ip;		/* 接收到的ip包的数量     */unsigned int packet_icmp;	/* 接收到的icmp包的数量   */unsigned int packet_igmp;	/* 接收到的igmp包的数量   */unsigned int packet_tcp;	/* 接收到的tcp包的数量    */unsigned int packet_udp;	/* 接收到的udp包的数量    */int print_flag_frame;		/* 是否打印帧头信息标志, 1表示打印, 0表示不打印 */int print_flag_arp;		/* 是否打印arp头信息标志  */int print_flag_ip;		/* 是否打印ip头信息标志   */int print_flag_rarp;		/* 是否打印rarp头信息标志 */int print_flag_tcp;		/* 是否打印tcp头信息标志  */int print_flag_udp;		/* 是否打印udp头信息标志  */int print_flag_icmp;		/* 是否打印icmp头信息标志 */int print_flag_igmp;		/* 是否打印igmp头信息标志 */
};/* 定义一个全局变量,用于存储全局信息 */
struct global_info global;struct ip_pair {unsigned int source_ip;unsigned int dest_ip;unsigned int count;
};/* 定义一个用于存储ip对的结构体数组 */
struct ip_pair ip_pair[10000];/* 一个用于初始化全局信息的函数 */
void init_global( struct global_info  * var );/* 一个用于打印全局信息的函数   */
void print_global( struct global_info var );/* 打印一个错误,并退出 		*/
void error_and_exit( char * msg, int exit_code );/* 设置网卡成混杂模式	        */
int set_card_promisc( char * interface_name, int sock );/* 把mac地址转换一个字符串      */
void mac_to_str( char * buf, char * mac_buf );/* 用于打印帮助信息 		*/
void help( void );/* 截获网卡帧数据,并进行数据分用*/
void do_frame( int sockfd );  /* 处理ip层数据		        */
void do_ip( char * data );/* 打印ip头信息 	        */
void print_ip( struct iphdr * );/* 处理arp层数据	       */
void do_arp( char * data );/* 打印arp头信息 	       */
void print_arp( struct arphdr * ); /* 处理rarp数据		       */
void do_rarp( char * data );/* 处理tcp层数据 	       */
void do_tcp( char * data );/* 打印tcp层头信息 	       */
void print_tcp( struct tcphdr * );/* 处理udp层数据 	       */
void do_udp( char * data );/* 打印udp层头信息 	       */
void print_udp( struct udphdr * );/* 处理icmp层数据	       */
void do_icmp( char * data );/* 打印icmp头信息	       */
void print_icmp( struct icmphdr * );/* 处理igmp层数据 	       */
void do_igmp( char * data );/* 打印igmp头信息	       */
void print_igmp( struct igmphdr * );/* 初始化一个全局结构体 	      */
void init_global( struct global_info  * var )
{var->bytes = 0;var->packet_num = 0;var->packet_arp = 0;var->packet_rarp = 0;var->packet_ip = 0;var->packet_icmp = 0;var->packet_igmp = 0;var->packet_tcp = 0;var->packet_udp = 0;var->print_flag_frame = 0;var->print_flag_arp = 0;var->print_flag_ip = 0;var->print_flag_rarp = 0;var->print_flag_tcp = 0;var->print_flag_udp = 0;var->print_flag_icmp = 0;var->print_flag_igmp = 0;
}/* 一个用于打印全局信息的函数  */
void print_global( struct global_info var )
{printf("\n\n********** 全局信息 *****************\n\n");printf("总共接收字节数: %d kbytes.\n", var.bytes / 1024 );printf("总共接受包数量: %d\n\n", var.packet_num );if( var.packet_arp ) printf("接收 arp 包数量: %d\n", var.packet_arp );if( var.packet_rarp) printf("接收 rarp 包数量: %d\n", var.packet_rarp );if( var.packet_ip )  printf("接收 ip 包数量: %d\n", var.packet_ip );if( var.packet_icmp) printf("接收 icmp 包数量: %d\n", var.packet_icmp );if( var.packet_igmp) printf("接收 igmp 包数量: %d\n", var.packet_igmp );if( var.packet_tcp ) printf("接收 tcp 包数量: %d\n", var.packet_tcp );if( var.packet_udp ) printf("接收 udp 包数量: %d\n", var.packet_udp );printf("\n");
}/* 用于处理当下按ctrl-c时的处理函数 */
void sig_int( int sig )
{print_global( global );int i;/*for( i=0; i<global.packet_ip; i++ ){printf("%15s ==>> ", inet_ntoa( *(struct in_addr *)( &ip_pair[i].source_ip ) ) );printf("%15s \n", inet_ntoa( *(struct in_addr *)( &ip_pair[i].dest_ip ) ));}*/exit( 0 );
}/* 打印错误信息,并退出            */
void error_and_exit( char * msg, int exit_code )  
{  herror( msg );  exit( exit_code );  
}  /* 设置网卡模式成混帐模式,这样的话可以截获以太网帧数据 */
int set_card_promisc( char * interface_name, int sock )  
{  /* 用于套接口ioctl的接口请求结构体 	*/struct ifreq ifr; /* 复制网卡名称进入请求结构体的名称元素 */strncpy(ifr.ifr_name, interface_name ,strlen( interface_name )+1);  /* 通过ioctl获得相应信息	        */if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {       	error_and_exit("ioctl", 2);  }  /* 设置网卡模式标志为混杂模式	       */ifr.ifr_flags |= IFF_PROMISC;  		            /* 通过ioctl把参数传递给网卡	       */  if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 )  	      error_and_exit("ioctl", 3);  
}  /* 把mac地址转换成字符串 */
void mac_to_str( char * buf, char * mac_buf )
{sprintf( mac_buf, "%02x:%02x:%02x:%02x:%02x:%02x",(unsigned char) *buf, (unsigned char)(*(buf+1)), (unsigned char)(*(buf+2)), (unsigned char)(*(buf+3)),(unsigned char)(*(buf+4)), (unsigned char)(*(buf+5)));mac_buf[17] = 0;
}void help( void )
{printf("Usage: capture [-h] [协议名称 ...].\n");printf("默认情况: 打印所有包信息.\n");
}void print_udp( struct udphdr * pudp )
{printf("==================== udp 头信息 ======================\n");printf("16位源端口号  : %d\n", ntohs( pudp->source ) );printf("16位目的端口号:	%d\n", ntohs( pudp->dest ) );printf("16位udp长度: %d\n", ntohs( pudp->len ) );printf("16位udp校验和: %d\n", ntohs( pudp->check ) );if( ntohs( pudp->len ) != sizeof(struct udphdr ) && ntohs( pudp->len ) < 20 ){char * data = ( char * )pudp + sizeof( struct udphdr );printf("UDP数据: %s\n", data );}
}void do_udp( char * data )
{global.packet_udp ++;struct udphdr * pudp = ( struct udphdr * )data;if( global.print_flag_udp )print_udp( pudp );	
}void print_tcp( struct tcphdr * ptcp )
{printf("==================== tcp 头信息 =====================\n");printf("源端口号  : %d\n", ntohs( ptcp->source ) );printf("目的端口号: %d\n", ntohs( ptcp->dest ) );printf("32位序列号  : %u\n", ntohl( ptcp->seq ) );printf("32位确认序号: %u\n", ntohl( ptcp->ack_seq ) );printf("首部长度: %d\n", ptcp->doff * 4 );printf("6个标志位: \n");printf("    紧急指针 urg : %d\n", ptcp->urg );printf("    确认序号位 ack : %d\n", ptcp->ack );printf("    接受方尽快将报文交给应用层 psh : %d\n", ptcp->psh );printf("    重建连接 rst : %d\n", ptcp->rst );printf("    用来发起连接的同步序号 syn : %d\n", ptcp->syn );printf("    发送端完成任务 fin : %d\n", ptcp->fin );printf("16位窗口大小: %d\n", ntohs( ptcp->window ) );printf("16位校验和: %d\n", ntohs( ptcp->check ) );printf("16位紧急指针: %d\n", ntohs( ptcp->urg_ptr ) );if( ptcp->doff * 4 == 20 ){printf("选项数据: 没有\n");} else {printf("选项数据: %d 字节\n", ptcp->doff * 4 - 20 );}char * data = ( char * )ptcp;data += ptcp->doff * 4;printf("数据长度: %d 字节\n", strlen(data) );if( strlen(data) < 10 )printf("数据: %s\n", data );
}void do_tcp( char * data )
{global.packet_tcp ++;struct tcphdr * ptcp;ptcp = ( struct tcphdr * )data;if( global.print_flag_tcp )	print_tcp( ptcp );
}void print_igmp( struct igmphdr * pigmp )
{printf("====================  igmp 包信息 ==========================\n");printf("igmp 版本: %d\n", pigmp->type & 15 );printf("igmp 类型: %d\n", pigmp->type >> 4 );printf("igmp 码: %d\n", pigmp->code );printf("igmp 校验和: %d\n", ntohs( pigmp->csum ) );printf("igmp 组地址: %d\n", ntohl( pigmp->group ) );
}void do_igmp( char * data )
{global.packet_igmp ++;struct igmphdr * pigmp = ( struct igmphdr * ) data;if( global.print_flag_igmp )print_igmp( pigmp );
}void print_icmp( struct icmphdr * picmp )
{printf("==================== icmp 包信息 ===========================\n");printf("消息类型: %d ", picmp->type );switch( picmp->type ){case ICMP_ECHOREPLY:printf("Ping的回显应答\n");break;case ICMP_DEST_UNREACH:printf("目的不可达\n"); break;case ICMP_SOURCE_QUENCH:printf("源端被关闭\n");break;case ICMP_REDIRECT:printf("重定相\n");  break;case ICMP_ECHO:printf("ping的回显请求\n");    break;case ICMP_TIME_EXCEEDED:printf("超时\n");break;case ICMP_PARAMETERPROB:printf("参数问题\n"); break;case ICMP_TIMESTAMP:printf("时间戳请求\n");   break;case ICMP_TIMESTAMPREPLY:printf("时间戳应答\n");   break;case ICMP_INFO_REQUEST:printf("信息请求\n");  break;case ICMP_INFO_REPLY:printf("信息应答\n"); break;case ICMP_ADDRESS:printf("地址掩码请求\n"); break;case ICMP_ADDRESSREPLY:printf("地址掩码应答\n"); break;default:printf("未知消息类型\n");break;}printf("消息类型的子选项: %d ", picmp->code );switch( picmp->type ){case ICMP_ECHOREPLY:printf("Ping的回显应答\n");break;case ICMP_DEST_UNREACH:switch( picmp->type ){case ICMP_NET_UNREACH:printf("网络不可到达\n"); break;case ICMP_HOST_UNREACH:printf("主机不可到达\n");  break;case  ICMP_PROT_UNREACH:printf("协议不可到达\n");break;  case  ICMP_PORT_UNREACH:printf("端口不可到达\n");break;case  ICMP_FRAG_NEEDED:printf("需要进行分片,但是又设置不分片位\n"); break;case  ICMP_SR_FAILED:printf("源站选路失败\n"); break;case  ICMP_NET_UNKNOWN:printf("目的网络不认识\n");break;case  ICMP_HOST_UNKNOWN:printf("目的主机不认识\n");break;case  ICMP_HOST_ISOLATED:printf("源主机北隔离\n");break;case  ICMP_NET_ANO:printf("目的网络被强制禁止\n");break;case  ICMP_HOST_ANO:printf("目的主机被强制禁止\n");break;case  ICMP_NET_UNR_TOS:printf("由于服务类型TOS,网络不可到达\n");break;case  ICMP_HOST_UNR_TOS:printf("由于服务类型TOS,主机不可到达\n");break;case  ICMP_PKT_FILTERED:printf("由于过滤,通信被强制禁止\n");break;case  ICMP_PREC_VIOLATION:printf("主机越权\n");break;case  ICMP_PREC_CUTOFF:printf("优先权中止生效\n");break;default:printf("未知代码\n");break;}break;case ICMP_SOURCE_QUENCH:printf("源端被关闭\n");break;case ICMP_REDIRECT:switch( picmp->type ){case ICMP_REDIR_NET:printf("对网络重定向\n");break;case ICMP_REDIR_HOST:printf("对主机重定向\n");   break;case ICMP_REDIR_NETTOS:printf("对服务类型和网络重定向\n");  break;case ICMP_REDIR_HOSTTOS:printf("对服务类型和主机重定向\n"); break;defalut:printf("未知代码\n");break;}break;case ICMP_ECHO:printf("ping的回显请求\n");    break;case ICMP_TIME_EXCEEDED:switch( picmp->type ){case ICMP_EXC_TTL:printf("在传输期间生存时间为0\n");break;case ICMP_EXC_FRAGTIME:printf("在数据组装期间生存时间为0\n"); break;default:printf("未知代码\n");break;}break;case ICMP_PARAMETERPROB:switch( picmp->type ){case 0:printf("IP首部错误(包括各种差错)\n");break;case 1:printf("缺少必须的选项\n");break;default:printf("原因未知\n"); break;}break;case ICMP_TIMESTAMP:printf("时间戳请求\n");   break;case ICMP_TIMESTAMPREPLY:printf("时间戳应答\n");   break;case ICMP_INFO_REQUEST:printf("信息请求\n");  break;case ICMP_INFO_REPLY:printf("信息应答\n"); break;case ICMP_ADDRESS:printf("地址掩码请求\n"); break;case ICMP_ADDRESSREPLY:printf("地址掩码应答\n"); break;default:printf("未知消息类型\n");break;}printf("校验和: %d\n", ntohs(picmp->checksum) );
}void do_icmp( char * data )
{global.packet_icmp ++;struct icmphdr * picmp = ( struct icmphdr * ) data;if( global.print_flag_icmp )print_icmp( picmp );
}void print_ip( struct iphdr * iph )
{printf("=============== ip 头信息 ===============\n");printf("IP 首部长度:%d\n", iph->ihl * 4 );printf("IP 版本    :%d\n", iph->version );printf("服务类型(tos): %d\n", iph->tos );printf("总长度字节: %d\n", ntohs(iph->tot_len) );printf("16位标识: %d\n", ntohs(iph->id) );printf("frag off: %d\n", ntohs(iph->frag_off) );printf("8位生存事件: %d\n", iph->ttl );printf("8位协议: %d\n", iph->protocol );printf("16位首部校验和: %d\n", ntohs(iph->check) );printf("32位源IP地址  : %s\n", inet_ntoa( *(struct in_addr *)(&iph->saddr)) );printf("32位目的IP地址: %s\n", inet_ntoa( *(struct in_addr *)(&iph->daddr)) );}void ip_count( struct iphdr * iph )
{ip_pair[ global.packet_ip - 1 ].source_ip = iph->saddr;ip_pair[ global.packet_ip - 1 ].dest_ip = iph->daddr;
}void do_ip( char * data )
{global.packet_ip ++;struct iphdr *pip;         pip = ( struct iphdr * ) data;    /* pip = point to ip layer */if( global.print_flag_ip )print_ip( pip );ip_count( pip );char * pdata = data + pip->ihl * 4;switch( pip->protocol ){case IPPROTO_ICMP:do_icmp( pdata );break;case IPPROTO_IGMP:do_igmp( pdata );break;case IPPROTO_TCP:do_tcp( pdata );break;case IPPROTO_UDP:do_udp( pdata );break;default:printf("IP: 未知其上层协议.\n");break;}
}void print_arp( struct arphdr * parp )
{printf("硬件类型: %d ", ntohs(parp->ar_hrd) );switch( ntohs( parp->ar_hrd ) ){case ARPHRD_ETHER:printf("Ethernet 10/100Mbps.\n");	break;case ARPHRD_EETHER:printf("Experimental Ethernet.\n");break;case ARPHRD_AX25:printf("AX.25 Level 2.\n");break;case ARPHRD_PRONET:printf("PROnet token ring.\n");break;case ARPHRD_IEEE802:printf("IEEE 802.2 Ethernet/TR/TB.\n");break;case ARPHRD_APPLETLK:printf("APPLEtalk.\n");break;case ARPHRD_ATM:	printf("ATM.\n");						break;case ARPHRD_IEEE1394:printf("IEEE 1394 IPv4 .\n");break;default:printf("Unknow.\n");break;}printf("映射的协议地址类型: %d ", ntohs(parp->ar_pro) );switch( ntohs(parp->ar_pro) ){case ETHERTYPE_IP:printf("IP.\n");break;default:printf("error.\n");break;}printf("硬件地址长度: %d\n", parp->ar_hln );printf("协议地址长度: %d\n", parp->ar_pln );printf("操作码: %d ", ntohs(parp->ar_op) );switch( ntohs(parp->ar_op) ){case ARPOP_REQUEST:printf("ARP 请求.\n");break;case ARPOP_REPLY:	printf("ARP 应答.\n");break;case ARPOP_RREQUEST:printf("RARP 请求.\n");break;case ARPOP_RREPLY:printf("RARP 应答.\n");break;case ARPOP_InREQUEST:printf("InARP 请求.\n");break;case ARPOP_InREPLY:printf("InARP 应答.\n");			break;case ARPOP_NAK:printf("(ATM)ARP NAK.\n");break;default:printf("arp 操作码错误.\n");break;}char * addr = (char*)(parp + 1);char buf[18];mac_to_str( addr, buf ); printf("发送端以太网地址: %s\n", buf );printf("发送端IP地址:     %s\n", inet_ntoa( *(struct in_addr *)(addr+6) ));mac_to_str( addr+10, buf );printf("目的以太网地址: %s\n", buf );printf("目的IP地址:     %s\n", inet_ntoa( *(struct in_addr *)(addr+16) ));
}void do_arp( char * data )
{global.packet_arp ++;struct arphdr * parp;parp = ( struct arphdr * ) data;if( global.print_flag_arp ) {printf("============= arp 头信息 ==============\n");print_arp( parp );}
}void do_rarp( char * data )
{global.packet_rarp ++;struct arphdr * parp;parp = ( struct arphdr * ) data;if( global.print_flag_rarp ){printf("============= rarp 头信息 =============\n");print_arp( parp );}
}/* 打印以太网帧的包头信息 */
void print_frame( struct ether_header * peth )
{/* 定义一个数组,用于存储把mac地址转换成字符串后的字符串 */char buf[ 18 ];printf("\n==================================   第 %d 个包  =======================================\n\n", global.packet_num );printf("==== 以太网帧信息 =====\n");char * shost = peth->ether_shost;mac_to_str( shost, buf );		printf("源以太网地址:  %s\n", buf );char * dhost = peth->ether_dhost;mac_to_str( dhost, buf );printf("目的以太网地址:%s\n", buf );
}/* 用于从网卡接受一帧数据,同时根据以太网协议字段传递数据给相应的上层协议处理 */
void do_frame( int sock )
{/* 用于存储一帧数据         */char frame_buf[ 2000 ];/* 清空帧数据缓冲区	    */bzero( frame_buf, sizeof(frame_buf) );int len = sizeof( frame_buf );/* 用于存储接受字节数       */int recv_num;/* 用于存储发送方的地址信息 */struct sockaddr_in addr;/* 从网卡接收一帧数据       */recv_num = recvfrom( sock, (char *)frame_buf, sizeof( frame_buf ), 0, ( struct sockaddr * )&addr, &len );  /* 所接收的包的总数自加1    */global.packet_num ++;/* 从网卡接收的字节总数     */global.bytes += recv_num;/* 打印接收的包是第几个包   *///printf("此帧数据长度: %d\n", recv_num );/* 定义一个用于指向以太网帧的指针 (这里我们只考虑最常见的以太网帧的情况) */struct ether_header * peth; /* 让以太网头指针指向从网卡接受到的帧的数据的开头 */peth = (struct ether_header *)frame_buf; /* 传递以太网帧首地址给打印以太网帧信息的打印函数 */if( global.print_flag_frame )print_frame( peth );/* 定义一个数据指针,用于指向以太网帧的数据部分    */char * pdata;/* 让 pdata 指向以太网帧的数据部分                */pdata = frame_buf + sizeof( struct ether_header );/* 根据以太网帧的协议字段进行数据分用 - 也就是进行数据拆封,根据协议字段调用相应层的处理函数 */switch( ntohs( peth->ether_type ) ){case ETHERTYPE_PUP:break;case ETHERTYPE_IP:do_ip( pdata );break;case ETHERTYPE_ARP:do_arp( pdata );break;case ETHERTYPE_REVARP:do_rarp( pdata );break;default:printf("Unkonw ethernet type  %d %x.\n", ntohs(peth->ether_type), ntohs(peth->ether_type) );break;}
}/* 主函数, 处理命令行输入, 设置好全局变量, 并调用接受和处理帧的函数 */int main( int argc, char ** argv )  
{  /* 用于存储套接口文件描述符 */int sockfd;/* 初始化全局变量 	  */init_global( &global );if( argc == 1 ) {       		/* 表示打印所有包头信息 */global.print_flag_frame = 1;global.print_flag_arp = 1;global.print_flag_ip = 1;global.print_flag_rarp = 1;global.print_flag_tcp = 1;global.print_flag_udp = 1;global.print_flag_icmp = 1;global.print_flag_igmp = 1;} else {		       /* 帮助 或者 通过指定协议名称只打印某层些协议 */if( !strcasecmp( argv[1], "-h" ) ){help();exit( 0 );} else { int i;for( i=1; i < argc; i++ ){if( !strcasecmp( argv[i], "frame" ) )global.print_flag_frame = 1;else if( !strcasecmp( argv[i], "arp" ) )global.print_flag_arp = 1;else if( !strcasecmp( argv[i], "rarp" ) )global.print_flag_rarp = 1;else if( !strcasecmp( argv[i], "ip" ) )global.print_flag_ip = 1;else if( !strcasecmp( argv[i], "tcp" ) )global.print_flag_tcp = 1;else if( !strcasecmp( argv[i], "udp" ) )global.print_flag_udp = 1;else if( !strcasecmp( argv[i], "icmp" ) )global.print_flag_icmp = 1;else if( !strcasecmp( argv[i], "igmp" ) )global.print_flag_igmp = 1;}}}/* 通过协议族AF_PACKET类信SOCK_RAW, 类型SOCK_RAW创建一个用于可以接受网卡帧数据的套接口,同时返回套就口文件描述符 */if( (sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) ) == -1 ) error_and_exit( "socket", 1 );  /* 如果发生错误,返回错误值, 并退出 *//* 设定网卡eth0成混杂模式 */set_card_promisc( "eth0", sockfd ); /* 设定信号处理函数, 下面是设置当我们按下ctrl-c时所调用的处理函数 */	signal( SIGINT, sig_int );/* 无限循环接收以太网卡数据帧, 并进行数据分用,直到你按下ctrl-c */while( 1 ){do_frame( sockfd );}  return 0;
}

  参考资料:

http://www.cnblogs.com/rollenholt/articles/2585432.html

http://www.binarytides.com/blog/c-packet-sniffer-code-with-libpcap-and-linux-sockets-bsd/

http://www.binarytides.com/blog/packet-sniffer-code-in-c-using-linux-sockets-bsd-part-2/

http://www.binarytides.com/blog/packet-sniffer-code-in-c-using-linux-sockets-bsd/

转载于:https://www.cnblogs.com/rollenholt/archive/2012/07/11/2585633.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark启动程序:Master

临时笔记def main(argStrings: Array[String]) {//读取以spark.开头的配置属性val conf new SparkConf//检查环境变量&#xff1a;SPARK_MASTER_HOST、SPARK_MASTER_PORT、SPARK_MASTER_WEBUI_PORT //再检查配置属性&#xff1a;master.ui.port //检查其他master配置&am…

iOS - Frame 项目架构

前言 iOS 常见的几种架构&#xff1a; 标签式 Tab Menu列表式 List Menu抽屉式 Drawer瀑布式 Waterfall跳板式 Springborad陈列馆式 Gallery旋转木马式 Carousel点聚式 Plus1、标签式 优点&#xff1a; 1、清楚当前所在的入口位置2、轻松在各入口间频繁跳转且不会迷失方向3、直…

Windows 10下,anaconda (conda) 虚拟环境的创建,jupyter notebook如何使用虚拟环境

手把手教您创建conda 虚拟环境 1 安装好anaconda后&#xff0c;会出现如下所示&#xff0c;这些都是anaconda集成啦&#xff0c;不需要再安装了。我们在如下所指的anaconda Prompt右键&#xff0c;以管理员运行 2 打开后&#xff0c;这就是prompt&#xff0c;我们输入pyth…

python下载文件传到服务器_python实现FTP文件传输的方法(服务器端和客户端)

用python实现FTP文件传输&#xff0c;包括服务器端和客户端&#xff0c;要求 &#xff08;1&#xff09;客户端访问服务器端要有一个验证功能 &#xff08;2&#xff09;可以有多个客户端访问服务器端 &#xff08;3&#xff09;可以对重名文件重新上传或下载 FTP&#xff08;F…

oracle数据库主键自增序列_Oracle数据库序列详解

前言&#xff1a;做过web开发的人员基本上都知道&#xff0c;数据库表中的主键值有的时候我们会用数字类型的并且自增。这样mysql、sql server中的都可以使用工具创建表的时候很容易实现。但是oracle中没有设置自增的方法&#xff0c;一般情况我们会使用序列和触发器来实现主键…

一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(9)--基于表单库的仪表板...

现在你已经知道了如何将服务台网站和表单与自定义视图放在一起&#xff0c;最后一步是使用SharePoint创建仪表板&#xff0c;以呈现表单中的信息的基本报表。表单设计者经常致力于表单以至于他们忘记了SharePoint的力量来聚合表单的属性&#xff0c;并建立KIPs和其他类型的报表…

SQL常用语句积累

SQL 常用语句积累&#xff1a;一、 SQL 基本语句SQL 分类&#xff1a;DDL —数据定义语言 (Create &#xff0c; Alter &#xff0c; Drop &#xff0c; DECLARE)DML —数据操纵语言 (Select &#xff0c; Delete &#xff0c; Update &#xff0c; Insert)DCL —数据控制语言 …

vscode 里 Import “numpy“ count not be resolved

问题如下&#xff1a; 我们分析一下这个问题&#xff0c;这里的问题。问题的翻译是&#xff1a;导入"numpy"不能被解决。 这可能有几个问题&#xff0c;1&#xff1a;vscode的python插件没有安装&#xff0c;2: vscode的python的解析器没有设置好。 按照这个思路&…

xdocument查找节点值_二叉查找树(java)

一棵二叉查找树(BST)是一颗二叉树&#xff0c;其中每个节点都含有一个Comparable的键且每个节点的键(以及相关的值)都大于其左子树中的任意节点的键而小于右子树的任意结点的键。数据表示和链表一样&#xff0c;我们嵌套定义了一个私有类来表示二叉查找树上的一个节点。每个节点…

三角形 画_CAD入门基础第3节:直角三角形的圆及如何修剪

这个软件&#xff0c;仔细想想&#xff0c;无非就两个命令&#xff0c;一是直线命令&#xff0c;二&#xff0c;就是圆。直线&#xff0c;无非也就是两种&#xff0c;一&#xff0c;是水平直线和垂直于水平直线的竖线&#xff0c;二&#xff0c;就是各种斜线。第一种直线&#…

【转】系统缓存全解析二:动态缓存(4)-第三方分布式缓存解决方案 Memcache(2)...

缓存系统MemCached的Java客户端优化历程&#xff08;转载自http://code.google.com/p/memcache-client-forjava/。&#xff09;Memcached是一种集中式Cache&#xff0c;支持分布式横向扩展。这里需要解释说明一下&#xff0c;很多开发者觉得Memcached是一种分布式缓存系统&…

windows 10下搭建pyspark与遇到的一些问题的解决方法

目录windows 10 下 搭建 pyspark所需要的工具过程与步骤windows 10 下 搭建 pyspark 所需要的工具 Java JDK 1.8.0 spark-2.2.0-bin-hadoop2.7 hadoop-2.7.3 winutils.exe 还需要有python环境&#xff0c;我用的是Anaconda 3&#xff08;默认你已经装好此环境&#xff09;。…

Linux VNC server 安装配置

1.安装vnc server[rootpxe ~]# yum install tigervnc-server -y2.设置 vnc server 开机启动[rootpxe ~]# chkconfig vncserver on3.修改vncserver 配置文件[rootpxe ~]# vi /etc/sysconfig/vncservers在配置文件后添加以下内容VNCSERVERS"2:root"VNCSERVERARGS[2]&qu…

为什么用python写爬虫_python-做爬虫,如何避免牢狱之灾

随着数据资源的爆炸式增长&#xff0c;网络爬虫的应用场景和商业模式变得更加广泛和多样&#xff0c;网络爬虫技术为数据收集者提供了极大的便利&#xff0c;也给专业网络爬虫公司带来巨大的收益。但是与之相伴的是许多人好奇的一件事——爬虫是否违法&#xff1f; 关于这个问题…

vue跳转页面增加等待_vue跳转页面方法

1. router-link1. 不带参数 //name,path都行, 建议用name // 注意&#xff1a;router-link中链接如果是/开始就是从根路由开始&#xff0c;如果开始不带/&#xff0c;则从当前路由开始。 2.带参数 // params传参数 (类似post)// 路由配置 path: "/home/:id"…

开发HTML5手机游戏的5个注意要点--手机开发前景-- 转

过去2年&#xff0c;我们都见证手机和社交游戏的兴起&#xff1a;两大游戏类型既各自发展&#xff0c;同时也开始互相渗透&#xff0c;融入HTML5技术。 手机社交游戏有自己的用户基础&#xff0c;日益蓬勃发展。 这个新兴游戏类型兼容网页社交游戏和本土应用的优点&#xff0c;…

栈(顺序存储)C++模板实现

#include <iostream> using namespace std;template <typename T> class stack{private:int top; //栈顶指针int maxLen; //栈最大长度T *data; //用数组来创建栈public:stack(int top_ -1 , int maxLen_ 10):top(top_),maxLen(maxLen_){data new T[maxLen]; …

java线程池参数含义

转载自 http://blog.csdn.net/zhouhl_cn/article/details/7392607 感谢分享 项目中开发通常不会直接使用ThreadPoolExecutor&#xff0c;而是通过Executors.newFixedThreadPool()这种简易写法&#xff0c;创建适合自己项目的线程池。但是了解最基本的线程池ThreadPoolExecutor是…

第5章 Python 数字图像处理(DIP) - 图像复原与重建1 - 高斯噪声

本章主要讲图像复原与重建&#xff0c;首先是了解一下各种噪声的特点与模型&#xff0c;还有形成的方法。一些重点的噪声&#xff0c;如高斯噪声&#xff0c;均匀噪声&#xff0c;伽马噪声&#xff0c;指数噪声&#xff0c;还有椒盐噪声等。 本章主要的噪声研究方法主要是加性噪…

十进制 转换 2-10 进制,int的扩展方法

public static int ConvertToBase(this int i, int baseToConvertTo){if (baseToConvertTo < 2 || baseToConvertTo > 10){throw new ArgumentException("无法完成转换" baseToConvertTo.ToString());}int resault 0; //存放结果int iterations 0; //十进…