-2

Wifi和Socket是什么关系?下面的 Socket 代码是否仍然适用于进行 Wifi 连接的地方?

   // IPv4 AF_INET sockets:
struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};


    #include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr

int main(int argc , char *argv[])
{
    int socket_desc;
    struct sockaddr_in server;

    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }

    server.sin_addr.s_addr = inet_addr("74.125.235.20");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

    //Connect to remote server
    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }

    puts("Connected");
    return 
    struct sockaddr {
        unsigned short    sa_family;    // address family, AF_xxx
        char              sa_data[14];  // 14 bytes of protocol address
    };
4

2 回答 2

2

你的问题不清楚。如果我很了解您想使用套接字访问您的无线网卡。在您的示例中,您没有使用正确类型的套接字。我举个例子来说明一下。

首先,您需要打开一个套接字类型 SOCK_RAW 并将返回值用作文件描述符。然后你将在目标中使用这个 FD 通过 ioctl() 函数传递一些命令。

int main() {

 struct ifreq ifr ; // for interface manipulation
 struct iwreq iwr ; // for wifi order (scan, connection...)

 int sock = socket(AF_PACKET,SOCK_RAW,0) // use htons(ETH_P_ALL) option to capture traffic
 if (sock == -1) {
  perror("socket error") ;

 /* Let's get the hardware address of your wifi interface */
 /* In my example the name of your wifi interface is wlan0 */

 memset(&ifreq,0,sizeof(struct ifreq)) 
 char hwaddr[6] ; 
 char ifname[5] ;
 strncpy(ifname,"wlan0",5) ; 
 memcpy(ifr.ifr_name,ifname,sizeof(ifr.ifr_name)) ; 
 ret = ioctl(sock,SIOCGIFHWADDR,&ifr) ; 
 if (ret < 0) 
  perror("error ioctl") ; 
 memcpy(hwaddr,ifr.ifr_name,6) ;
 printf("HWaddr : %s\n",hwaddr) ; 

 return 0 ;  

}

注意:此代码不包含头文件。一个简单的互联网研究会给你它。我邀请您阅读使用 ifreq 结构可以创建的所有命令: 使用 ifreq

对于 iwreq,我更喜欢让你在这里发现: 使用 iwreq

如果您想使用套接字和无线访问(不使用 pcap 库)制作 tcpdump,您可以在打开原始套接字时设置 HTONS(ETH_P_ALL) 选项,并将无线接口的索引绑定到此套接字(参见 SIOCGIFINDEX ioctl 和 sockaddr_ll 结构)。来自这个套接字的一个简单的 recv() 将为您提供到物理层的所有流量。之后,您将需要学习如何解释接收到的数据。

希望它会帮助你。

安东尼

于 2013-07-22T12:34:36.417 回答
1

Wifi和Socket是什么关系?下面的 Socket 代码是否仍然适用于进行 Wifi 连接的地方?

是的。套接字 API 是一个抽象层,不依赖于网络接口。在您的代码中,Wifi 和套接字之间没有关系。

于 2013-07-22T07:52:46.880 回答