COMMENTS

ioctl及getifaddrs读取IPV4,IPV6网卡信息

使用ioctl的SIOCGIFCONF可以读取所有网卡信息。ioctl调用后返回指向ifconf的结构链表,其中包含了指向ifreq的结构指针。ifconf及ifreq定义在net/if.h中。

《UNIX网络编程》中提供了get_ifi_info函数的实现方法,使用这种方式来获取网络信息。在LINUX下,这种方式不能获得IPV6的网卡信息。《UNIX网络编程》中有如下描述:

在支持IPV6的系统中,没有关于对SIOCGIFCONF请求是否返回IPV6地址的标准。我们给支持IPV6的新系统增加了一个case语句, 这是为了预防万一。问题在于ifreq中的联合把返回的地址定义成一个通用的16字节套接口地址结构,适合16字节的IPV4 socket_in结构,但对于24字节的IPV6 socket_in6结构太小了。如果返回IPV6地址,将可能破环现有的在每个ifreq结构中采用固定大小的套接口地址结构的代码。

经测试,在fedor6-2.6.18kernel中无法返回ipv6地址,事实上,返回的地址簇总是AF_INET,而并非AF_INET6。
这种方法的实现代码如下:

继续阅读

ioctl对madwifi驱动网卡的SSID设置操作

下面一则小程序实现了对无线网卡的SSID设置操作,网卡使用madwifi-hal-0.10.5.6驱动。其中wireless_copy.h头文件在madwifi/tools下,需要将这个头文件包含在这则小程序中。更多的其他诸如channel的设置,请参考http://gattaca.ru/~nikki/wrt54g/wpa/x/wpa_supplicant/driver_wext.c

以下为程序源码,与大家共享
get_set_ssid.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio .h>
#include <stdlib .h>
#include <sys /socket.h>
#include <string .h>
#include "wireless_copy.h"
 
int get_essid(int sock, struct iwreq* wrq,char* ssid);
int set_essid(int sock, struct iwreq* wrq,char* value);
 
int main(){
 
	struct iwreq wrq;
	int i,sock;
	char gInterfaceName[16];
	char *ssid=(char *)malloc(sizeof(char)*(32+1));
	char *set_ssid="testssid";
 
	memset(ssid,0,sizeof(ssid));
	memset(gInterfaceName, 0, sizeof(gInterfaceName));
	strcat(gInterfaceName,"ath0");
 
	sock = socket(AF_INET, SOCK_DGRAM, 0);
		if (sock < 0) 
		{
			printf("Error Creating Socket for ioctl\n"); 
			return 0;
		}
	memset(&wrq, 0, sizeof(wrq));
	strncpy(wrq.ifr_name, gInterfaceName, IFNAMSIZ);
//get ssid
	get_essid(sock, &wrq,ssid);
 
	printf("old ssid:%s\n",wrq.u.essid.pointer);
	free(ssid);
//reset struct
	memset(&wrq, 0, sizeof(wrq));
	strncpy(wrq.ifr_name, gInterfaceName, IFNAMSIZ);
//set ssid	
	set_essid(sock, &wrq,set_ssid);
 
	printf("new ssid:%s\n",wrq.u.essid.pointer);
}
 
 
int get_essid(int sock, struct iwreq* wrq,char* ssid)
{
 
	wrq->u.essid.length=32;
	wrq->u.essid.pointer=(caddr_t) ssid;
      	if(ioctl(sock, SIOCGIWESSID, wrq) < 0)
	{
		perror("Ioctl error");
		free(ssid);
		return(0);
	}	
 
	printf("\nssid from function get_ssid: %s\n", wrq->u.essid.pointer);
 
	return 1;
}
 
int set_essid(int sock, struct iwreq* wrq,char* value)
{
	wrq->u.essid.pointer=value;
	wrq->u.essid.length=strlen(value);
	wrq->u.essid.flags=1;
      	if(ioctl(sock, SIOCSIWESSID, wrq) < 0)
	{
		perror("Ioctl error");
		return(0);
	}	
 
	printf("\nessid from function set_essid: %s\n", wrq->u.essid.pointer);
 
	return 1;
}
</string></sys></stdlib></stdio>

继续阅读