域套接字 多客戶端實現

2021-10-22 18:26:47 字數 3393 閱讀 2484

我們在linux 應用開發中,如果需要實現程序間通訊的多客戶端介面,就需要引入select 和epoll 相關機制了,本文介紹下epoll的功能的實現。

多客戶端使用場景,比如我們需要開發乙個庫介面,提供給客戶呼叫,那麼使用域套接字實現程序間通訊,就必須在service端引入多路復用,否則庫功能就只能被乙個程序使用了。

注意事項:

socket service 位址被占用,bind urc service unix udp socket failure: address already in use 報這個解決方法

刪除 原位址檔案

配置setsockopt(sockfd,sol_socket,so_reuseaddr,&on,sizeof(on)

service端

#

include

#include

#include

#include

#include

#include

#include

#include

#define

dbg_printf(.

..)printf

("[%s.%d]"

,__func__

,__line__);

printf

(__va_args__)

#define

unix_socket_file

"/home/linux/test/socket/temp.file"

static

int sockfd =0;

static

struct

sockaddr_un servaddr,cliaddr;

intmain

(int argc,

const

char

*ar**)

if(access

(unix_socket_file,f_ok)==0

)memset

(&servaddr,0,

sizeof

(servaddr));

servaddr.sun_family = af_unix;

strcpy

(servaddr.sun_path,unix_socket_file);if

(0!=bind

(sockfd,

(struct

sockaddr*)

&servaddr,

sizeof

(servaddr)))

if(0!=

listen

(sockfd,10)

)int clilen =

sizeof

(cliaddr.sun_family)

+strlen

(cliaddr.sun_path);/*

if((connfd = accept(sockfd,(struct sockaddr *)&cliaddr,(socklen_t *)&clilen)) == -1)

dbg_printf("accept success connfd = %d \n",connfd);

*/char recvbuf[64]

;int n =0;

int epfd;

epfd =

epoll_create

(100);

struct

epoll_event ev;

ev.events= epollin;

ev.data.fd = sockfd;

//將sockfd 新增到 監控事件的表中

epoll_ctl

(epfd,epoll_ctl_add,sockfd,

&ev)

;int datafd =0;

int i =0;

struct

epoll_event evrdy[

100]

;while(1

)else

//程序間通訊描述符

else

if(n ==0)

else

if(n >0)

}}}close

(sockfd)

;return0;

}

client端
#

include

#include

#include

#include

#include

#include

#include

#define

dbg_printf(.

..)printf

("[%s.%d]"

,__func__

,__line__);

printf

(__va_args__)

#define

unix_socket_file

"/home/linux/test/socket/temp.file"

static

int sockfd =0;

static

struct

sockaddr_un servaddr,cliaddr;

intmain

(int argc,

const

char

*ar**)

memset

(&servaddr,0,

sizeof

(servaddr));

servaddr.sun_family = af_unix;

strcpy

(servaddr.sun_path,unix_socket_file)

;int serlen =

sizeof

(servaddr.sun_family)

+strlen

(servaddr.sun_path);if

(connect

(sockfd,

(struct

sockaddr*)

&servaddr,serlen)==-

1)dbg_printf

("conect success \n");

char recvbuf[64]

;char sendbuf[64]

;while(1

)close

(sockfd)

;return0;

}

編譯上面檔案為service 和client

client 我修改 傳送內容 hello world 和 i love you ,編譯生成client1 和client2,客戶端與service通訊, 測試如下

多客戶端套接字實驗之執行緒響應

學習過計算機網路的同學,知道三次握手和四次揮手的同學可以略過下面的解釋。何為套接字,你讓乙個人找到你家在哪,那麼需要的就是位址,何為位址 哪個省 哪個市 哪個小區 哪一棟樓 哪個門牌號 那麼計算機網路通訊世界中的套接字就是如此,這裡記住它就是乙個ip位址 埠號。不深究其原理,懂的意思就行,深究清出門...

QTcpServer實現多客戶端連線

qtcpserver使用請見 qtcpsocket qt使用tcp通訊實現服務端和客戶端 qtcpserver類預設提供的只有無引數的newconnection的訊號,這樣雖然知道有人連線了,並且可以通過nextpendingconnection獲取連線的socket,但並不便於管理,尤其是在連線斷...

同步客戶端套接字示例

同步客戶端套接字示例 下面的示例程式建立乙個連線到伺服器的客戶端。該客戶端是用同步套接字生成的,因此掛起客戶端應用程式的執行,直到伺服器返回響應為止。該應用程式將字串傳送到伺服器,然後在控制台顯示該伺服器返回的字串。using system using system.net using system...