色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 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號

回到頂部

主站蜘蛛池模板: 被黑人伦流澡到高潮hn小说 | 五月花成人网 | 国产精品视频一区二区三区四区五区 | wwwxxx国产| 91i在线| 黑人大鷄巴XXX高湖 在线视频观看免费视频18 | 国产精品爽爽久久久久久 | 国内精品视频在线播放不卡 | 午夜无码片在线观看影院 | 十六以下岁女子毛片免费 | 色毛片 | 中国老太婆xxxhd | 亚洲午夜色情天天久久 | 在线精品福利 | 国产免费久久精品99RE丫丫 | 国产精选污视频在线观看 | 亚洲男女内射在线播放 | 亚洲国产成人久久三区 | 少妇午夜啪爽嗷嗷叫视频 | 翁公粗大挺进王丽霞高潮嗨文 | 欧美成人午夜免费影院 | 23部禽女乱小说内裤畸情视频 | 综合亚洲另类欧美久久成人精品 | 亚洲精品偷拍无码不卡AV | 国产精品狼人久久久久影院 | 蜜芽AⅤ色欲AV浪潮夜夜嗨 | 国产乱码精品一区二区三区麻豆 | 欧美一区二区成人片 | 亚洲精品拍拍央视网出文 | GOGOGO免费高清日本TV | 免费国产线观看免费观看 | 成人亚洲欧美成αⅴ人在线观看 | 国产乱人伦偷精品视频免 | 丝袜老师高潮呻吟高潮 | 521av永久免费地址 | 菠萝蜜视频在线观看 | 国产精品人人爱 | vagaa亚洲亚洲色爽免影院 | 国产一级精品绿帽视频 | 韩国色戒3免费播放 | 最近免费观看在线中文2019 |