请教:Linux下用C如何连接一个WIFI ? 已知ssid,密码,加密方式

dos5gw 2012-11-16 04:06:08
请教:Linux下用C如何连接一个WIFI ? 已知ssid,密码,加密方式。

查了很多资料,搜出来的只有android+java的,不知道c如何实现?
是调用linux 系统api函数? 还是wifi芯片厂商提供的sdk函数?

...全文
1275 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
muzhan_li 2015-04-10
  • 打赏
  • 举报
回复
跪求完整代码,头文件那些,不胜感激
zhangxuyu1118 2013-08-05
  • 打赏
  • 举报
回复
USB wifi 还是 sdio wifi
max_min_ 2013-07-25
  • 打赏
  • 举报
回复
楼主 求套源码,或者 楼主根据你的公司代码, 写个小demo分享啦!!!! 真心求
prowllw 2013-07-24
  • 打赏
  • 举报
回复
lz那个代码能使用马?求完整能运行的代码~
dos5gw 2012-12-15
  • 打赏
  • 举报
回复
移植了一个wpa_sipplicant, 我的程序和wpa_sipplicant进程通信
jinjianxinxh 2012-12-14
  • 打赏
  • 举报
回复
建议楼主看看meego的源代码 ,貌似有c实现的
baickl 2012-12-14
  • 打赏
  • 举报
回复
没有在文本模式下连过WIFI~~~
dos5gw 2012-11-18
  • 打赏
  • 举报
回复
引用 2 楼 deep_pro 的回复:
这个操作应该是用shell写最简单的 c调用shell命令即可
我这有一段连接wifi的代码,有几个地方不太明白,程序首先创建了一个loopback的socket套接字,比如这样:

pClient->thisAddr.sin_family = AF_INET;
        pClient->thisAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
        pClient->thisAddr.sin_port = ntohs(INADDR_ANY);

        if (bind(pClient->sockFd, (struct sockaddr *) &pClient->thisAddr, sizeof(pClient->thisAddr)) < 0)
            {
            printf("@err: bind error(%x).\n", errno);
            goto fail;
            }
然后用send()函数把ssid,密码发送到这个套接字,似乎就可以连接wifi了,不明白这样做是什么道理 完整的代码

/******************************************************************
 Name:        iSTCClientOpen
 Description: open a socket for wifi
 ******************************************************************/
int iSTCClientOpen(void)
    {
    Client_t *pClient = (Client_t *)calloc(1, sizeof(Client_t));

    if (pClient != NULL)
        {
        pClient->sockFd = socket(AF_INET, SOCK_STREAM, 0);
        if (pClient->sockFd < 0)
            {
            printf("@err: socket() for Send\n");
            goto fail;
            }

        pClient->thisAddr.sin_family = AF_INET;
        pClient->thisAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
        pClient->thisAddr.sin_port = ntohs(INADDR_ANY);

        if (bind(pClient->sockFd, (struct sockaddr *) &pClient->thisAddr, sizeof(pClient->thisAddr)) < 0)
            {
            printf("@err: bind error(%x).\n", errno);
            goto fail;
            }

        pClient->peerAddr.sin_family = AF_INET;
        pClient->peerAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
        pClient->peerAddr.sin_port = ntohs(DEFAULT_PORT);

        if (connect(pClient->sockFd, (struct sockaddr *)&pClient->peerAddr, sizeof(pClient->peerAddr)) < 0)
            {
            printf("@err: connect %d:%s\n", errno,strerror(errno));
            goto fail;
            }
        }

    return (int)pClient;

fail:
    if (pClient)
        {
        if (pClient->sockFd >= 0)
            close(pClient->sockFd);
        free(pClient);
        }

    return 0;
    }

int iSTC_WIFI_Connect(char *ESSID, char *Password,int Encryptiontype, char *ifname, int timeout)
    {
    int ret = -1;
    int len;
    char buf[256];
    int cid = iSTCClientOpen();
    if(cid == 0)
    {
        return -1;
    }
    Client_t *pClient = (Client_t *)cid;

    iSTCHead_t *pHead = (iSTCHead_t *)buf;
    iSTCWifiConnect_t *pConnect = (iSTCWifiConnect_t *)pHead->data;

    strncpy(pConnect->ESSID, ESSID,sizeof(pConnect->ESSID));
    strncpy(pConnect->Password, Password,sizeof(pConnect->Password));
#ifndef USEISTCDAEMON
    strncpy(pConnect->ifname,ifname,sizeof(pConnect->ifname));
    pConnect->Encryption_type = Encryptiontype;
#endif
    pConnect->timeout = timeout;

    pHead->version  = iSTC_VERSION;
    pHead->type     = iSTC_TYPE_REQUEST;
    pHead->length   = sizeof(iSTCWifiConnect_t);
    pHead->seq      = 0;
    pHead->command  = iSTC_CMD_WIFI_CONNECT;
    pHead->checksum = 0;
    printf("Encryptiontype %d ,%d,%d\n",Encryptiontype,sizeof(iSTCHead_t),pHead->length);
    len = send(pClient->sockFd, pHead, sizeof(iSTCHead_t) + pHead->length, 0);
    if (len != sizeof(iSTCHead_t) + pHead->length) goto bye;
    printf("send over\n");
    len = read(pClient->sockFd, pHead, sizeof(iSTCHead_t));
    if (len != sizeof(iSTCHead_t)) goto bye;
printf("read over\n");
    if (pHead->response == iSTC_OK)
        ret = 0;
    else
        ret = -1;
	if(pHead->response == iSTC_ERROR_SYSTEM)
	{
		printf("----------------wpa error ---------\n");
	system("killall wpa_cli\n");
	system("killall wpa_supplicant\n");
	sleep(1);
	system("wpa_supplicant -B -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0\n");
	sleep(1);
    system("wpa_cli &\n");
	}
bye:
    iSTCClientClose(cid);
    return ret;
    }



deep_pro 2012-11-18
  • 打赏
  • 举报
回复
这个操作应该是用shell写最简单的 c调用shell命令即可

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧