簡體   English   中英

嘗試在C中編寫netlink套接字程序時出錯

[英]An error while attempting to write a netlink socket program in C

首先,您可以從我之前的帖子中找到我的情況的詳細信息

我花了大約一天時間在netlink socket程序上進行第一次嘗試。

而且我並沒有試圖讓它聽起來像我沒有從我在互聯網上找到的其他人的示例代碼中獲得所有這些代碼,因為我們都知道我做到了這一點。

但是我一直在嘗試對代碼進行逆向工程(參見結束),經過幾個小時的調試后,我終於讓它編譯沒有錯誤。 但在嘗試運行它之后,我收到消息“Segmentation Fault(Core Dumped)”。

現在我知道這個錯誤與嘗試從無效的內存位置讀取有關但我老實說不明白我拼接的一半代碼,所以如果有人能指出我哪里出錯我會很感激。

如果你能解釋我在嘗試通過netlink套接字發送消息時的正確與錯誤,我也非常感謝你。 比如說,我會把信息放在哪里? 因為我真的不知道我現在用我的代碼發送什么消息。 任何幫助表示贊賞!

#include <sys/socket.h>       /*  socket definitions        */
#include <sys/types.h>        /*  socket types              */
#include <linux/netlink.h>  /* netlink functions */
#include <sys/uio.h>        /* scatter-gather definition for iovec */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>


/*  Global constants  */

#define ECHO_PORT          (2002)
#define MAX_LINE           (1000)

int socketHolder; // declare variable to hold Socket

// Set up configuration for destination which holds the socket to be used to communicate with the Kernel
struct sockaddr_nl dest; // declare variable to hold Socket Address
// Set up configuration for the netlink message header
struct nlmsghdr *netlinkHeader; // declare variable to hold message to be sent
// Set up configuration for the scatter-gather function for expediting writing to buffer
struct iovec iov;
// Set up configuration for the message header for simplifying message parameters to be sent
struct msghdr message;

int main()
{

memset(&dest, 0, sizeof(dest)); // set socket Address to all 0
dest.nl_family = AF_NETLINK; // set socket family to AF_NETLINK
dest.nl_pad = 0; // defaults to 0
dest.nl_pid = 0; // set address of netlink socket to 0 because we're going to the kernel
dest.nl_groups = 0; // set to 0 because we're doing unicast

netlinkHeader->nlmsg_pid = 0; // set sender port number to 0 because we're in kernel

iov.iov_base = (caddr_t)netlinkHeader; // set address of buffer
iov.iov_len = netlinkHeader->nlmsg_len; // set length of buffer

message.msg_name = (caddr_t) &dest; // set socket name
message.msg_namelen = sizeof(dest); // set length of name
message.msg_iov = &iov; // I have no idea what this is
message.msg_iovlen = 1; // number of iov blocks
message.msg_control = NULL;  // ignore
message.msg_controllen = 0;  // ignore
message.msg_flags = 0;  //ignore

socketHolder = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); // declare Socket and assign to holder variable

bind(socketHolder, (struct sockaddr *) &dest, sizeof(dest)); // bind the destination settings to socketHolder

int sender = sendmsg(socketHolder, &message, 0); // send the message

}

不幸的是,我對netlink不太熟悉。 但是你的錯誤很可能在這里:

netlinkHeader->nlmsg_pid = 0; // set sender port number to 0 because we're in kernel

因為你從來沒有初始化netlinkHeader ,即確保指針指向你可以讀寫的內存,這是未定義的行為。 實際上,由於您正在訪問某個隨機地址,並且您的操作系統會阻止您的進程破壞事物,因此通常會導致分段錯誤。

不知道為什么這是一個指針,你應該嘗試使它成為struct nlmsghdr類型的實際實例,因為它聽起來好像你想操縱地址。

此外,注釋暗示代碼來自內核代碼,而您的代碼不是內核代碼,這可能意味着還存在其他問題。

如果您確定導致分段錯誤的行會有所幫助,但是從您顯示的代碼看起來似乎是下面的行。

netlinkHeader->nlmsg_pid = 0;

您尚未初始化netlinkHeader指針以指向某個有效的內存位置,因此當您嘗試將值0寫入屬性netlinkHeader->nlmsg_pid它會導致您看到的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM