使用C发送原始Internet数据包

时间:2017-09-20 16:46:27

标签: c sockets raw-sockets

我想使用C语言的原始套接字发送原始数据包。我制作了一个头文件,我可以在我的项目中使用它。它被命名为“Inet.h”。守则:

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


int createSocket();
ssize_t sendBuffer(int socket, char buffer[], ssize_t length);

ssize_t sendBuffer(int socket, char buffer[], ssize_t length)
{
    return send(socket, &buffer, length, 0);
}

int createSocket()
{
        int _socket_ = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
        return _socket_;
}

createSocket()方法效果很好,但sendBuffer()总是会产生问题。我做了一个测试代码:

#include "Inet.h"

int main()
{
    int socket = createSocket();
    printf("%i\n", socket);

        char buffer[16] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P'};
    ssize_t t = sendBuffer(socket, buffer, 16);
    printf("%zd\n",t);
    return 0;
}

输出如下:

3

-1

所以Socket,正如我已经说过,但是我不知道为什么sendBuffer函数不起作用。请帮忙。

3 个答案:

答案 0 :(得分:1)

您的buffer有错误。当您将send()参数传递给buffer时,您将在调用堆栈上传递buffer[]本身的地址,而不是它指向的地址(main()变量在&)。您需要删除ssize_t sendBuffer(int socket, char buffer[], ssize_t length) { //return send(socket, &buffer, length, 0); return send(socket, buffer, length, 0); } 运算符:

com.sidSparkScala.RatingsCounter

答案 1 :(得分:0)

检查border-width以查看当errno呼叫失败时操作系统提供的错误。一般来说,原始套接字访问需要提升权限(例如,您可以通过使用send()运行程序来授予权限)。

答案 2 :(得分:0)

您可能还需要将套接字与接口绑定。像这样:

if ( bind( raw, (struct sockaddr*) &info.ll, sizeof( struct sockaddr_ll ))  == -1 )
  perror("binding to interface");

要获取接口,请尝试以下方法:

if ( getifaddrs( &ifa ) == -1) {
  perror("Couldn't get interface information");
}