socketethpall
Ⅰ 多網卡多網段轉發問題
在你的伺服器上安裝路由和遠程訪問服務(添加刪除程序-添加組件中有),然後指向路由,就可以了!
相當於把你這台伺服器當路由器來使用!
Ⅱ htons和ETH_P_IP是在那個頭文件里定義的
Linux/include/linux/byteorder/generic.h
Linux/include/uapi/linux/if_ether.h
在http://lxr.free-electrons.com/ident 里可以查到
Ⅲ 怎麼提高下面代碼中socket的發包速率
#!/usr/bin/python
import socket
from scapy.all import *
import hack_arp
import ip_account
import random
import
import ssh_cmd
def udp_send_rcv(local_mac,local_addr,local_port,gw_mac,remote_addr,remote_port,txt,verbose = False) :
eth = Ether(dst=gw_mac,src=local_mac);
ip = IP(dst=remote_addr,src=local_addr);
udp = UDP(sport = local_port , dport = remote_port);
p = eth/ip/udp/txt ;
d = srp1(p,timeout=5);
if verbose == True :
d.show();
return p,d ;
#sendp(p);
def udp_send(sk,pkt):
#sk.sendto(str(pkt),(pkt['IP'].dst,pkt['UDP'].dport));
sk.send(str(pkt));
def main_test(pkt_num=1000,verbose = False,fast_mode=True) :
arp_group = {} ;
ip_header_map = {} ;
for i in range(2,201) :
gw_mac = hack_arp.get_gateway_hw(hack_arp.get_gateway_ip()) ;
ip = "192.168.31."+str(i);
mac = "be:ef:e5:1e:89:"+hex(i)[2:];
eth = Ether(dst=gw_mac);
ip_header = IP(dst = "10.237.100.9",src = ip);
udp_header = UDP(sport = 9000, dport = 9999);
ip_header_map[ip] = .deep(eth/ip_header/udp_header) ;
score = {} ;
cmp_txt = 'z'*1500 ;
if fast_mode == True :
try:
#s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW)
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))
#s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
except socket.error , msg:
print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
# tell kernel not to put in headers, since we are providing it
#s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
#s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
s.bind(("eth0",0));
s.setblocking(0);
for i in range(pkt_num) :
index = random.randint(2,200);
local_addr = "192.168.31."+str(index) ;
#txt = str(i)[0] * random.randint(10,1300);
txt = cmp_txt[0:100];
udp_send(s,ip_header_map[local_addr]/txt);
if not score.has_key(local_addr) :
score[local_addr] = (0,0,0,0);
score[local_addr] = (score[local_addr][0]+len(txt)+28,score[local_addr][1]+1,score[local_addr][2]+len(txt)+28+7,score[local_addr][3]+1);
else :
for i in range(pkt_num) :
index = random.randint(2,200);
local_addr = "192.168.31."+str(index) ;
local_port = 9000 ;
local_mac = "be:ef:e5:1e:89:"+hex(index)[2:] ;
gw_mac = "8C:BE:BE:10:05:88" ;
remote_addr = "10.237.100.9" ;
remote_port = 9999 ;
txt = cmp_txt[0:100];
p,d = udp_send_rcv(local_mac,local_addr,local_port,gw_mac,remote_addr,remote_port,str(index)+" send msg "+txt,verbose=verbose);
if not score.has_key(local_addr) :
score[local_addr] = (0,0,0,0);
print score[local_addr]
if verbose == True :
p.show();
d.show();
#score[local_addr] = (score[local_addr][0]+1,score[local_addr][1]+len(p['Raw'].load)+28,score[local_addr][2]+1,score[local_addr][3]+d['IP'].len);
score[local_addr] = (score[local_addr][0]+len(p['Raw'].load)+28,score[local_addr][1]+1,score[local_addr][2]+d['IP'].len,score[local_addr][3]+1);
if verbose == True :
print score ;
res = ip_account.ip_account();
if verbose == True :
print res ;
if_fail = 0 ;
fail_msg = "";
for src in score :
if not res.has_key(src) :
res[src] = (0,0,0,0);
if score[src] == res[src] :
print src + ": matched."
else :
if_fail = 1 ;
fail_msg = fail_msg + src + ": dismatched."+ str(score[src])+":"+ str(res[src]) + ";";
print "error:"
print src + ": dismatched."+ str(score[src])+":"+ str(res[src]);
if if_fail == 1 :
print "failed."
return if_fail,fail_msg
#tcp_link("192.168.31.171",9102,"192.168.31.98",9999);
if __name__=="__main__":
cmd = "" ;
#for i in range(2,201) :
# ip = "192.168.31."+str(i);
# #mac = "be:ef:e5:1e:89:"+hex(i)[2:];
# mac = "f8:b1:56:e3:12:60" ;
# cmd = "arp -s " + ip + " " + mac ;
# ssh_cmd.ssh_cmd("192.168.31.1","xxxxxx",cmd);
fail_table = {} ;
for i in range(1000) :
if_fail,fail_msg = main_test(pkt_num = 100000,verbose=True)
if if_fail == 1 :
fail_table[i] = fail_msg ;
print fail_table ;
Ⅳ 在android JNI中通過socket獲取MAC硬體地址,socket創建成功,但調用ioctl的時候,返回-1,怎麼回事
這跟具體的WLAN驅動有關系,在你手機上不行說明你手機的WLAN驅動沒有實現這個參數的ioctl
Ⅳ 能否通過socket獲取本機IP地址,子網掩碼,或者是網卡名稱
可以實現的,使用ioctl函數,加上想獲得的選項即可。
正好手頭有個類似的例子:
=======================================================
#include <stdio.h>#include <sys/types.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXINTERFACES 16
int main(int argc, char **argv){
register int fd, interface, retn = 0;
struct ifreq buf[MAXINTERFACES];
struct arpreq arp;
struct ifconf ifc;
char mac[32] = "";
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) { ifc.ifc_len = sizeof buf;
ifc.ifc_buf = (caddr_t) buf;
if (!ioctl(fd, SIOCGIFCONF, (char *) &ifc)) {
interface = ifc.ifc_len / sizeof(struct ifreq);
printf("interface num is interface=%d\n\n", interface);
while (interface-- > 0) {
printf("net device %s\n", buf[interface].ifr_name);
/*Jugde whether the net card status is promisc */
if (!(ioctl(fd, SIOCGIFFLAGS, (char *) &buf[interface]))) { if (buf[interface].ifr_flags & IFF_PROMISC) {
printf("the interface is PROMISC");
return 0;
}
} else {
char str[256] = "";
sprintf(str, "cpm: ioctl device %s",buf[interface].ifr_name);
perror(str);
}
/*Jugde whether the net card status is up */ if (buf[interface].ifr_flags & IFF_UP) {
printf("the interface status is UP\n");
} else {
printf("the interface status is DOWN\n");
}
/*Get IP of the net card */ if (!(ioctl(fd, SIOCGIFADDR, (char *) &buf[interface]))) {
printf("IP address is:");
printf("%s\n", inet_ntoa(((struct sockaddr_in*) (&buf[interface].ifr_addr))->sin_addr));
} else {
char str[256] = "";
sprintf(str, "cpm: ioctl device %s",buf[interface].ifr_name);
perror(str);
}
/*Get HW ADDRESS of the net card */ if (!(ioctl(fd, SIOCGIFHWADDR, (char *) &buf[interface]))) {
printf("HW address is:");
sprintf(mac, "%02x%02x%02x%02x%02x%02x",
(unsigned char) buf[interface].ifr_hwaddr.sa_data[0],
(unsigned char) buf[interface].ifr_hwaddr.sa_data[1],
(unsigned char) buf[interface].ifr_hwaddr.sa_data[2],
(unsigned char) buf[interface].ifr_hwaddr.sa_data[3],
(unsigned char) buf[interface].ifr_hwaddr.sa_data[4],
(unsigned char) buf[interface].ifr_hwaddr.sa_data[5]); // 利用sprintf轉換成char *
printf("%s\n", mac);
printf("\n");
}
else {
char str[256];
sprintf(str, "cpm: ioctl device %s",buf[interface].ifr_name);
perror(str);
}
} //end of while
} else
perror("cpm: ioctl");
} else
perror("cpm: socket");
close(fd);
return retn;
}
==============================================
輸出:
[root@temp]$./deleteme interface num is interface=2
net device eth0the interface status is UP
IP address is:10.6.15.102
HW address is:005056a44485
net device lothe interface status is UP
IP address is:127.0.0.1
HW address is:000000000000