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

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

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 欧美大片在线影院| 精品国产乱码久久久久久虫虫漫画 | 日韩中文字幕在线精品| 欧美性猛交99久久久久99按摩| 国产成人精品久久二区二区91| 亚洲欧洲一区二区三区久久| 日韩欧美中文免费| 亚洲在线观看视频| 欧美日韩国内自拍| 亚洲一区中文字幕| 欧美黑人巨大精品一区二区| 亚洲爱爱爱爱爱| 色综合久久久久久中文网| 成人国产精品久久久| 精品中文字幕在线2019| 亚洲精品欧美日韩专区| 欧美日韩在线第一页| 亚洲精品天天看| 欧美最猛性xxxxx亚洲精品| 一区二区三区在线播放欧美| 国产精品69av| 精品久久中文字幕久久av| 亚洲二区在线播放视频| 97在线视频免费观看| 中文日韩电影网站| 成人av色在线观看| 久久久久久国产免费 | 久久国产精品久久精品| 成人精品久久一区二区三区| 久久露脸国产精品| 亚洲最新av在线| 国产免费一区视频观看免费| 狠狠久久亚洲欧美专区| 亚洲日韩中文字幕| 国产精品视频免费在线观看| 日韩欧美在线免费| 自拍视频国产精品| 亚洲电影av在线| 国产久一一精品| 97av在线播放| 欧美日韩国产中文字幕 |