- 論壇徽章:
- 0
|
用下面的這個代碼片斷, 注釋我已經(jīng)寫好.
在 unix-like 系統(tǒng)上, ifconfig 都采用的下面類似下面的函數(shù)實(shí)現(xiàn).
說白了, 都是 BSD 實(shí)現(xiàn)或變型.
Good Luck, 晚安!
- 1 typedef struct _if_conf_param{
- 2 struct sockaddr addr;
- 3 struct sockaddr mask;
- 4 struct sockaddr brcst;
- 5 struct sockaddr hw_addr;
- 6 }if_conf_param_t;
- 7
- 8 int change_if_param(const char *name, if_conf_param_t *if_param)
- 9 {
- 10 int ret = 0;
- 11 int sockfd;
- 12 struct ifreq ifr;
- 13 struct sockaddr_in *sin;
- 14 strcpy(ifr.ifr_name, name);
- 15
- 16 /* open an sock to communicate with interface */
- 17 if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- 18 return -1;
- 19
- 20 /* set ip address */
- 21 ifr.ifr_addr = if_param->addr;
- 22 if (ioctl(sockfd, SIOCSIFADDR, &ifr) < 0)
- 23 return -1;
- 24
- 25 /* set ip mask and broadcase address */
- 26 sin = (struct sockaddr_in *)&if_param->addr;
- 27 if (sin->sin_addr.s_addr != INADDR_ANY) {
- 28
- 29 /* set ip mask */
- 30 if (if_param->mask.sa_family == AF_INET) {
- 31 ifr.ifr_netmask = if_param->mask;
- 32 if (ioctl(sockfd, SIOCSIFNETMASK, &ifr) < 0)
- 33 return -errno;
- 34 }
- 35
- 36 /* set broadcase address */
- 37 if (if_param->brcst.sa_family == AF_INET) {
- 38 ifr.ifr_broadaddr = if_param->brcst;
- 39 if (ioctl(sockfd, SIOCSIFBRDADDR, &ifr) < 0)
- 40 return -errno;
- 41 }
- 42 }
- 43
- 44 close(sockfd);
- 45
- 46 return 0;
- 47 }
復(fù)制代碼 |
|