色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > socket進程間通信方式大總結,還有典型實例哦

socket進程間通信方式大總結,還有典型實例哦 時間:2018-06-19      來源:未知

socket在主機間和進程間使用,方法類似,主要區別是進程間通信使用的是sockaddr_un,而主機間的通信使用的是sockadd_in。

每個套接字都有其自己的地址格式,對于AF_UNIX域套接字來說,它的地址由結構sockaddr_un來描述,該結構定義在頭文件sys/un.h中,它的定義如下:

struct sockaddr_un {

__kernel_sa_family_t sun_family; /* AF_UNIX */

char sun_path[UNIX_PATH_MAX]; /* pathname */

};

對于AF_INET域套接字來說,它的地址結構由sockaddr_in來描述,它至少包括以下幾個成員:

struct sockaddr_in {

__kernel_sa_family_t sin_family; /* Address family */

__be16 sin_port; /* Port number */

struct in_addr sin_addr; /* Internet address */

/* Pad to size of `struct sockaddr'. */

unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -

sizeof(unsigned short int) - sizeof(struct in_addr)];

};

使用socket作為進程間通信方式,有什么注意事項?

(1) Server

a. 創建一個server socket

創建的socket是AF_UNIX域的。

b. 設置Server的地址

利用bind函數。

注意:地址一般通過一個字符串來標識,一般的做法是通過一個Linux路徑來實現;注意使用之前必須要把該路徑unlink掉,否則可能出現bind失敗的情況。

c. 開始監聽

利用listen函數。

注意:最大監聽的長度為128.

d. 接收連接

利用accept函數。

注意:accept函數默認為阻塞模式。有一個可以設置非阻塞的為accept4函數;

在accept函數阻塞的過程中,一些信號對打斷accept的阻塞,這是正常現象。因此如果要設置一直阻塞,需要考慮這種情況。

e. 接收數據

利用recv()函數

注意:recv函數是在accept新生成的socket上接收消息。recv()函數可以工作在阻塞模式,也可以工作在非阻塞模式。一般都是阻塞模式。新生成的socket注意要關閉。

(2) client

a. 創建

注意域為AF_UNIX。

b. 連接服務器:connect調用

注意:connect為非阻塞模式,需要增加重試機制保證可靠性。

c. 發送數據:send

注意:該調用可以是阻塞的,也可以是非阻塞的,最好設置為非阻塞模式,默認為阻塞模式。另外,可以調用setsockopt()來設置阻塞時長。level:SOL_SOCKET,SO_SNDTIMEO。

例子如下:

server

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef struct sockaddr SA;

int main(int argc, const char *argv[])

{

//1.定義變量

int sockfd, clientfd;

socklen_t addrlen = sizeof(SA);

struct sockaddr_un addr;

ssize_t nbytes;

char buf[32] = {0};

//2.創建本地套接字接口

sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

if(sockfd < 0){

perror("socket err");

exit(-1);

}

//3.填充本地地址信息

bzero(&addr, addrlen);

addr.sun_family = AF_UNIX;

strcpy(addr.sun_path, "unix_sock");

//4.綁定本地套接字

remove("unix_sock");

if(bind(sockfd, (struct sockaddr *)&addr, addrlen) < 0){

perror("bind err");

exit(-1);

}

//5.監聽套接字

if(listen(sockfd, 5) < 0){

perror("listen err");

exit(-1);

}

//6.接收連接

clientfd = accept(sockfd, NULL, NULL);

while(1)

{

//7.接收客戶端數據

nbytes = recv(clientfd, buf, 32, 0);

if(nbytes < 0){

perror("recv err");

exit(-1);

}else if (nbytes == 0) {

printf("peer exit\n");

break;

}else{

printf("recv data = %s\n", buf);

}

}

//8.關閉套接字

close(clientfd);

close(sockfd);

}

client

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef struct sockaddr SA;

int main(int argc, const char *argv[])

{

//1.定義變量

int sockfd;

socklen_t addrlen = sizeof(SA);

struct sockaddr_un addr;

char buf[32] = {0};

//2.創建本地套接字接口

sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

if(sockfd < 0){

perror("socket err");

exit(-1);

}

//3.填充服務器的地址信息

bzero(&addr, addrlen);

addr.sun_family = AF_UNIX;

strcpy(addr.sun_path, "unix_sock");

//4.連接服務器

if(connect(sockfd, (struct sockaddr *)&addr, addrlen) < 0){

perror("connect err");

exit(-1);

}

//5.收發數據

while (1) {

gets(buf);

send(sockfd, buf, 32, 0);

}

//6.關閉套接字

close(sockfd);

}

上一篇:Linux文件描述符獲取方法及詳細介紹,這里讓你快速學習

下一篇:資深程序員告訴你串口配置的詳細流程,不容錯過

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5,京公海網安備11010802025203號

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 热久久免费视频精品| 日韩av最新在线| 久久五月天综合| 91亚洲国产精品| 性色av一区二区三区免费| 亚洲欧美国产va在线影院| 国产99久久精品一区二区| 欧美乱大交做爰xxxⅹ性3| 日韩av综合网站| 国产精品一区二区在线| 欧美极品少妇xxxxⅹ裸体艺术| 一区二区欧美在线| 成人a免费视频| 日本精品性网站在线观看| 欧美日韩成人网| xvideos成人免费中文版| 日韩av在线导航| 国产精品亚洲第一区| 91精品国产网站| 欧美激情视频免费观看| 欧美精品日韩三级| 最近2019好看的中文字幕免费| 亚洲第一av网| 成人免费午夜电影| 国产精品com| 欧美亚洲激情在线| 欧美激情免费看| 欧美日韩国产色| 久久这里只有精品99| 中文字幕亚洲欧美| 亚洲人成电影在线| 亚洲精品久久在线| 亚洲成人精品视频| 亚洲福利视频久久| 亚洲a在线观看| 成人激情视频在线播放| 国产精品一区二区电影| 国产高清在线不卡| 国产精品电影网| 国产精品免费一区二区三区都可以| 欧美亚洲一区在线|