我想使用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函数不起作用。请帮忙。
答案 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");
}