色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號

回到頂部

主站蜘蛛池模板: 久久天天躁拫拫躁夜夜AV | 男女爽爽午夜18污污影院 | 亚洲精品无码久久一线 | 国产午夜无码视频在线观看 | 国产二区交换配乱婬 | 曰韩欧美 | 日本无码一区二区三区在线观看 | 国产gv在线观看受被做哭 | A片无码午夜久久久涩涩 | 久久亚洲日韩看片无码 | 免费看成人A级毛片 | 欧美搡bbbbb摔bbbbb | 日韩免费无码一区二区视频 | 亚洲AV一本岛在线播放 | 囯产精品一区二区三区线 | 国产高清吃奶成免费视频网站 | 亚洲美女又黄又爽在线观看 | 香蕉视频在线观看亚洲 | 涩涩涩视频在线观看 | 99ri视频| 日本高清免费情在线视频免费下个 | 麻豆蜜桃视频 | 1000部毛片A片免费观看 | 久久国产精品成人免费 | 国内精品伊人久久久久影院对白 | 中国一级黄色片 | 国产精品毛片一区视频 | 最近中文AV字幕在线中文 | 被多个强壮的黑人灌满精 | 十六以下岁女子毛片免费 | 午夜三级理论在线观看 | 99久久国产综合精品五月天 | yellow高清免费观看日本 | 欧美日韩久久久久久 | 久久性色欲AV免费精品观看 | 伊人亚洲综合影院首页 | 在线无码免费的毛片视频 | 日本熟妇无码色视频在线观看 | 免费网站在线观看人数在哪买 | 女邻居丰满的奶水在线观看 | 人人澡人人妻人人爽人人蜜桃麻豆 |