linux socket程式設計(udev舉例)

2021-06-24 11:23:32 字數 2753 閱讀 1465

union sockaddr_union ;

通常的套介面位址

struct sockaddr ;

unix本地通訊套介面位址

struct sockaddr_un

;netlink的套介面位址

struct sockaddr_nl

;socket程式設計介面:

socket

udev_device_new_from_device_id

udev_monitor_new_from_netlink_fd

udev_ctrl_new_from_fd

rename_netif

bind

udev_monitor_enable_receiving

udev_ctrl_enable_receiving

sendmsg

udev_monitor_send_device

recvmsg

udev_ctrl_receive_msg

close

udev_monitor_disconnect

udev_monitor_unref

udev_ctrl_unref

udev_ctrl_get_connection

udev_ctrl_connection_unref

總體來看,在udev中建立乙個socket服務程式,來接收來自核心的訊息。

相當於是udev中的socket為伺服器端,核心為客戶端。

伺服器端呼叫listen之後,就可以接收客戶端的連線請求。

伺服器端再呼叫accept4,來建立同客戶端的連線,由此之後,客戶端,也即是核心有了新訊息的時候,會自動把訊息傳送到udev的socket服務程式。

1.      呼叫socket函式:建立乙個netlink socket

3.      呼叫listen函式:宣告可以開始接收連線請求。

4.      呼叫accept4函式:獲得連線請求並建立連線。

5.      呼叫getsockopt函式:獲取socket的資訊

6.      呼叫setsockopt函式:設定socket的資訊

struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd)

struct udev_ctrl *uctrl;

uctrl = calloc(1, sizeof(struct udev_ctrl));

if (uctrl == null)

return null;

uctrl->refcount = 1;

uctrl->udev = udev;

if (fd < 0) else {

uctrl->bound = true;

uctrl->sock = fd;

/* uctrl->saddr 是struct sockaddr_un 型別,un為unix縮寫,即為使用unix本地通訊協議的socket。下面的操作:

1.       指定通訊協議族saddr.sun_family為本地unix通訊協議(不是網路協議af_inet為網路協議族)。

2.       指定uctrl的socket需要連線的另一端,即該socket要連線到「/run/udev/control」檔案區。

3.       下文bind完成的工作就是將uctrl的socke同目標檔案連線。

uctrl->saddr.sun_family = af_local;

util_strscpy(uctrl->saddr.sun_path, sizeof(uctrl->saddr.sun_path), "/run/udev/control");

uctrl->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(uctrl->saddr.sun_path);

return uctrl;

int udev_ctrl_enable_receiving(struct udev_ctrl *uctrl)

int err;

if (!uctrl->bound) {

err = bind(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen);

if (err < 0 && errno == eaddrinuse) {

unlink(uctrl->saddr.sun_path);

err = bind(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen);

if (err < 0) {

err = -errno;

log_error("bind failed: %m\n");

return err;

/*listen之後,uctrl->sock開始從uctrl->saddr包含的目標處接收連線請求 。*/

err = listen(uctrl->sock, 0);

if (err < 0) {

err = -errno;

log_error("listen failed: %m\n");

return err;

uctrl->bound = true;

uctrl->cleanup_socket = true;

return 0;

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...

Linux Socket程式設計 執行緒

本章主要列舉伺服器程式的各種網路模型,示例程式以及效能對比後面再寫。一 分類依據。伺服器的網路模型分類主要依據以下幾點 1 是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函式 2 是否多執行緒,多執行緒間如何組織 3 是否多程序,多程序的切入點一般都是accept函式前 二 分類。首先根據是否...