我已经编写了以下程序来获取我的桌面当前所连接的无线网络的ESSID,但它给出了错误。有没有人能帮我纠正这些bug?代码:
#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);
}我收到以下错误:
> 1. Get ESSID ioctl failed
> 2. errno = 7
> 3. Error description : Argument list too long发布于 2013-11-02 03:05:48
在使用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);发布于 2011-05-09 21:10:02
您正在测试错误的ioctl(2)返回码。ioctl(2)在出错时返回-1,不为真(非零)。由于没有返回错误,因此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);
}编辑:去掉那些不正确的代码,下面是这样的:
id = new char(IW_ESSID_MAX_SIZE+1);也许你的意思是:
id = new char[IW_ESSID_MAX_SIZE+1];前者仅分配单个字符,并将其值设置为IW_ESSID_MAX_SIZE+1。后者分配一个大小为IW_ESSID_MAX_SIZE+1的数组。
通过这种更改,代码对我有效,并且不会为ioctl提供错误。
发布于 2011-05-10 02:07:34
尝试将wreq.u.essid.length设置为正确的值。
https://stackoverflow.com/questions/5937757
复制相似问题