国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

lv7 嵌入式開發(fā)-網(wǎng)絡(luò)編程開發(fā) 13 UNIX域套接字

這篇具有很好參考價(jià)值的文章主要介紹了lv7 嵌入式開發(fā)-網(wǎng)絡(luò)編程開發(fā) 13 UNIX域套接字。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1 UNIX 域流式套接字

2 UNIX 域數(shù)據(jù)報(bào)套接字


1 UNIX 域流式套接字

UNIX 域流式套接字(UNIX domain stream socket)是一種在同一臺主機(jī)上的進(jìn)程之間進(jìn)行通信的機(jī)制。它不依賴于網(wǎng)絡(luò)協(xié)議棧,而是使用文件系統(tǒng)作為通信的基礎(chǔ)。

UNIX 域流式套接字提供可靠的、雙向的、面向連接的通信方式。與傳統(tǒng)的套接字不同,UNIX 域套接字不需要經(jīng)過網(wǎng)絡(luò)協(xié)議棧,數(shù)據(jù)直接通過內(nèi)核中的緩沖區(qū)進(jìn)行傳遞,因此具有低延遲和高效率的特點(diǎn)。

UNIX 域流式套接字廣泛用于本地進(jìn)程之間的通信,例如在同一臺服務(wù)器上的多個(gè)進(jìn)程之間共享數(shù)據(jù)、同步操作等。它是一種高效、可靠的 IPC(進(jìn)程間通信)機(jī)制。

本地地址

struct sockaddr_un {
  unsigned short sun_family;    /* 協(xié)議類型 */
  char sun_path[108];        /* 套接字文件路徑 */
};

UNIX 域流式套接字的用法和 TCP 套接字基本一致,區(qū)別在于使用的協(xié)議和地址不同

UNIX 域流式套接字服務(wù)器端流程如下:

(1)創(chuàng)建 UNIX 域流式套接字。

(2)綁定本地地址(套接字文件)。

(3)設(shè)置監(jiān)聽模式。

(4)接收客戶端的連接請求。

(5)發(fā)送/接收數(shù)據(jù)。

補(bǔ)充:在linux中輸入man bind,下方有流套接字示例代碼

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MY_SOCK_PATH "/tmp/my_sock_file"
#define LISTEN_BACKLOG 50

#define handle_error(msg) \
	do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(int argc, char *argv[])
{
	int sfd, cfd;
	struct sockaddr_un my_addr, peer_addr;
	socklen_t peer_addr_size;
	char buf[BUFSIZ] = {};

	sfd = socket(AF_UNIX, SOCK_STREAM, 0);
	if (sfd == -1)
		handle_error("socket");

	memset(&my_addr, 0, sizeof(struct sockaddr_un));
	my_addr.sun_family = AF_UNIX;
	strncpy(my_addr.sun_path, MY_SOCK_PATH,
			sizeof(my_addr.sun_path) - 1);

	if (bind(sfd, (struct sockaddr *) &my_addr,
				sizeof(struct sockaddr_un)) == -1)
		handle_error("bind");
	if (listen(sfd, LISTEN_BACKLOG) == -1)
		handle_error("listen");

	peer_addr_size = sizeof(struct sockaddr_un);
	cfd = accept(sfd, (struct sockaddr *) &peer_addr,
			&peer_addr_size);
	if (cfd == -1)
		handle_error("accept");
	
	recv(cfd, buf, BUFSIZ, 0);
	printf("%s\n", buf);

	close(cfd);
	close(sfd);
    //不刪除文件,下次打開會出錯(cuò)
	remove(MY_SOCK_PATH);
	return 0;
}

UNIX 域流式套接字客戶端流程如下。

(1)創(chuàng)建 UNIX 域流式套接字。

(2)指定服務(wù)器端地址(套接字文件)。

(3)建立連接。

(4)發(fā)送/接收數(shù)據(jù)。

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MY_SOCK_PATH "/tmp/my_sock_file"

#define handle_error(msg) \
	do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(int argc, char *argv[])
{
	int fd;
	struct sockaddr_un peer_addr;
	char buf[BUFSIZ] = {"Hello World!"};

	fd = socket(AF_UNIX, SOCK_STREAM, 0);
	if (fd == -1)
		handle_error("socket");

	memset(&peer_addr, 0, sizeof(struct sockaddr_un));
	peer_addr.sun_family = AF_UNIX;
	strncpy(peer_addr.sun_path, MY_SOCK_PATH,
			sizeof(peer_addr.sun_path) - 1);

	if (connect(fd, (struct sockaddr *) &peer_addr,
				sizeof(struct sockaddr_un)) == -1)
		handle_error("connect");

	printf("%s\n",buf);
	send(fd, buf, strlen(buf), 0);

	close(fd);
	return 0;
}

2 UNIX 域數(shù)據(jù)報(bào)套接字

UNIX 域數(shù)據(jù)套接字(UNIX domain datagram socket)是一種在同一臺主機(jī)上的進(jìn)程之間進(jìn)行通信的機(jī)制。類似于UNIX 域流式套接字,UNIX 域數(shù)據(jù)套接字也不依賴于網(wǎng)絡(luò)協(xié)議棧,而是使用文件系統(tǒng)作為通信的基礎(chǔ)。

UNIX 域數(shù)據(jù)套接字提供無連接的、不可靠的通信方式。它使用數(shù)據(jù)報(bào)(datagram)進(jìn)行通信,每個(gè)數(shù)據(jù)報(bào)都是獨(dú)立的、自包含的消息單元。與UNIX 域流式套接字不同,UNIX 域數(shù)據(jù)套接字不需要建立連接,數(shù)據(jù)可以直接發(fā)送和接收。

UNIX 域數(shù)據(jù)套接字適用于面向消息的通信模式,可以用于實(shí)現(xiàn)進(jìn)程間的異步通信,發(fā)送和接收各種類型的消息,如命令、狀態(tài)信息等。它也常用于本地進(jìn)程間的通信,特別是在需要高效、低延遲的情況下。與UNIX 域流式套接字相比,UNIX 域數(shù)據(jù)套接字在功能上更為簡單,但傳輸效率更高。

UNIX 域用戶數(shù)據(jù)報(bào)套接字的流程可參考 UDP 套接字

UNIX 域流式套接字服務(wù)器端流程如下:

(1)創(chuàng)建 UNIX 域流式套接字。

(2)綁定本地地址(套接字文件)。

(3)發(fā)送/接收數(shù)據(jù)。

服務(wù)端

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MY_SOCK_PATH "/tmp/my_sock_file"
#define handle_error(msg) \
	do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(int argc, char *argv[])
{
	int fd;
	struct sockaddr_un my_addr, peer_addr;
	socklen_t peer_addr_size;
	char buf[BUFSIZ] = {};

	fd = socket(AF_UNIX, SOCK_DGRAM, 0);
	if (fd == -1)
		handle_error("socket");

	memset(&my_addr, 0, sizeof(struct sockaddr_un));
	my_addr.sun_family = AF_UNIX;
	strncpy(my_addr.sun_path, MY_SOCK_PATH,
			sizeof(my_addr.sun_path) - 1);

	if (bind(fd, (struct sockaddr *) &my_addr,
				sizeof(struct sockaddr_un)) == -1)
		handle_error("bind");

	peer_addr_size = sizeof(struct sockaddr_un);
	recvfrom(fd, buf, BUFSIZ, 0, (struct sockaddr *) &peer_addr,
			&peer_addr_size);
	printf("%s\n",buf);
	close(fd);
    //不刪除文件下次打開會出錯(cuò)
	remove(MY_SOCK_PATH);
	return 0;
}

客戶端?文章來源地址http://www.zghlxwxcb.cn/news/detail-727686.html

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MY_SOCK_PATH "/tmp/my_sock_file"
#define handle_error(msg) \
	do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(int argc, char *argv[])
{
	int fd;
	struct sockaddr_un peer_addr;
	socklen_t peer_addr_size;
	char buf[BUFSIZ] = {"Hello World!"};

	fd = socket(AF_UNIX, SOCK_DGRAM, 0);
	if (fd == -1)
		handle_error("socket");

	memset(&peer_addr, 0, sizeof(struct sockaddr_un));
	peer_addr.sun_family = AF_UNIX;
	strncpy(peer_addr.sun_path, MY_SOCK_PATH,
			sizeof(peer_addr.sun_path) - 1);

	peer_addr_size = sizeof(struct sockaddr_un);
	printf("%s\n", buf);
	sendto(fd, buf, strlen(buf), 0, (struct sockaddr *) &peer_addr,
			peer_addr_size);
	close(fd);
    //不刪除文件下次打開會出錯(cuò)
	remove(MY_SOCK_PATH);
	return 0;
}

到了這里,關(guān)于lv7 嵌入式開發(fā)-網(wǎng)絡(luò)編程開發(fā) 13 UNIX域套接字的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包