我编写了以下程序来获取我的桌面当前连接的无线网络的ESSID,但它给了我错误.任何人都可以帮我纠正错误吗?码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/wireless.h>
#define IW_INTERFACE "wlan0"
extern int errno;
struct iwreq wreq;
int main (void)
{
int sockfd;
char * id;
memset(&wreq, 0, sizeof(struct iwreq));
sprintf(wreq.ifr_name, IW_INTERFACE);
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Cannot open socket \n");
fprintf(stderr, "errno = %d \n", errno);
fprintf(stderr, "Error description is : %s\n",strerror(errno));
exit(1);
}
printf("Socket opened successfully \n");
id = new char(IW_ESSID_MAX_SIZE+1);
wreq.u.essid.pointer = id;
if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
fprintf(stderr, "Get ESSID ioctl failed \n");
fprintf(stderr, "errno = %d \n", errno);
fprintf(stderr, "Error description : %s\n",strerror(errno));
exit(2);
}
printf("IOCTL Successfull\n");
printf("ESSID is %s\n", wreq.u.essid.pointer);
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
> 1. Get ESSID ioctl failed
> 2. errno = 7
> 3. Error description : Argument list too long
Run Code Online (Sandbox Code Playgroud)
在使用 werq 之前你应该先正确设置长度,检查一下,
int sockfd;
char * id;
id = new char[IW_ESSID_MAX_SIZE+1];
struct iwreq wreq;
memset(&wreq, 0, sizeof(struct iwreq));
wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
sprintf(wreq.ifr_name, IW_INTERFACE);
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Cannot open socket \n");
fprintf(stderr, "errno = %d \n", errno);
fprintf(stderr, "Error description is : %s\n",strerror(errno));
exit(1);
}
printf("\nSocket opened successfully \n");
wreq.u.essid.pointer = id;
if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
fprintf(stderr, "Get ESSID ioctl failed \n");
fprintf(stderr, "errno = %d \n", errno);
fprintf(stderr, "Error description : %s\n",strerror(errno));
exit(2);
}
printf("IOCTL Successfull\n");
printf("ESSID is %s\n", (char *)wreq.u.essid.pointer);
Run Code Online (Sandbox Code Playgroud)
您正在错误地测试返回代码ioctl(2)
。ioctl(2)
出错时返回 -1,而不是 true(非零)。由于未返回错误,因此 in 中的值errno
未定义且具有误导性。
它应该是:
if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
fprintf(stderr, "Get ESSID ioctl failed \n");
fprintf(stderr, "errno = %d \n", errno);
fprintf(stderr, "Error description : %s\n",strerror(errno));
exit(2);
}
Run Code Online (Sandbox Code Playgroud)
编辑:排除了错误的代码后,结果如下:
id = new char(IW_ESSID_MAX_SIZE+1);
Run Code Online (Sandbox Code Playgroud)
也许你的意思是:
id = new char[IW_ESSID_MAX_SIZE+1];
Run Code Online (Sandbox Code Playgroud)
前者仅分配一个字符并将其值设置为IW_ESSID_MAX_SIZE+1
。后者分配一个 size 的数组IW_ESSID_MAX_SIZE+1
。
经过这一更改,代码对我有用,并且不会给出 ioctl 错误。
归档时间: |
|
查看次数: |
3930 次 |
最近记录: |