我使用的是4.x linux內核,有一個內核模塊,當我打開一個套接字時,我接收套接字資訊。
if((fd = socket(sai.sin_family, skt_type, skt_protocol)) < 0)
/ ...)
在這種情況下,我正在使用UDP,在我使用sendto()傳輸我的第一位元資料之前,我希望能夠從我的客戶程式中傳遞一個資料結構到我的內核模塊。然后我可以在我的協議中添加額外的資訊,并將這些資料與檔案描述符聯系起來。這不是用戶資料,相反,它旨在控制我的協議將如何運作。
我想傳入并與套接字相關的資料結構類似于以下內容。
struct some_tag_info_t {
int field_t;
char field_a[MAX_A];
void *field_b;
};
我感覺ioctl可能會對我有所幫助,因為它似乎能夠用檔案描述符來操作底層設備引數。
在net/socket.c中,ioctl()是:
static long sock_ioctl(struct file *file。unsigned cmd, unsigned long arg)
而在這個函式之后,我看到了這樣的評論。
/*
* 在ioctl中,arg很可能是一個用戶模式的指標,但我們不知道如何處理它。
*如何處理它--這仍然是由協議決定的。
*/
看來我可以使用arg來傳遞我上面的struct some_tag_info_t?有人能對此發表意見嗎?有什么想法嗎?
uj5u.com熱心網友回復:
你的理解是正確的,你可以從用戶空間向你的ioctl()處理器傳遞任何東西,然后由內核模塊正確處理你傳遞的任何命令和引數。然而,由于你正在使用套接字和撰寫你自己的協議,通過getsockopt(2)/setsockopt(2)來實作這一功能將更為合適。setsockopt(2)的引數可以是任何你想要的。在用戶空間,你會做這樣的事情:
res = setsockopt(sock_fd, &your_struct, sizeof(your_struct))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/328681.html
標籤:
