linux下基於雙線程收發程式

2021-05-27 08:01:51 字數 2563 閱讀 7729

1) 使用兩個執行緒管理收發佇列,為主函式提供獨有的收發介面;

2) 使用鎖,為併發資源即緩衝佇列提供互斥操作;

3) libevent/ select: 使用libevent或者select監視socket控制代碼,執行緒不阻塞;

4) socket:使用socket介面進行接收和傳送。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^分割線^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

linux環境下一切皆檔案,socket即套接字介面,呼叫socket()函式來獲得相應套接字介面的檔案描述符。

#include

#include

int socket(int domain,int type,int protocol);
引數說明:

domain: 一般情況下設成af_inet;

type:tcp連線用sock_stream, udp連線用sock_dgram,sock_raw能到協議內部進行高效處理,sock_conn_dgram是帶連線的資料報協議,目前只有atm是支援的;

protocol:協議型別往往和具體的domain有關係,設為0自動選擇。

返回者為申請的socket介面描述符,如果失敗返回-1。

udp傳輸:1. 宣告並初始化本地和遠端sockaddr_in變數,設定本地ip和埠:

bzero(&serv_addr,sizeof(serv_addr));

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(serv_port);

if(!strncmp(serv_ip,"anyaddr",100))

serv_addr.sin_addr.s_addr = htonl(inaddr_any);

else

serv_addr.sin_addr.s_addr = inet_addr(serv_ip);

以上**中,serv_ip可以是本機上任意位址,這種情況下設為 inaddr_any

bzero(&remote_addr,sizeof(remote_addr));

remote_addr.sin_family = af_inet;

remote_addr.sin_port = htons(remote_port);

remote_addr.sin_addr.s_addr = inet_addr(remote_ip);

udp 的socket套接字可以不呼叫connect()函式,目標位址可以在寫入的時候指定,因此可以使用乙個套接字向多個主機傳送資料。

傳送函式有:write( )、send( )、sendto( ),在使用write( )和send( )時,必須先呼叫connect()

繫結目標主機位址;

接收函式有:read( )、recv( )、recvfrom( ),在使用read( )和recv( )時,必須先呼叫

connect()

繫結目標主機位址,使用recvfrom( )

,接收的時候同時獲得源位址和埠

注意,udp的socket套接字在呼叫connect()函式的時候,並沒有和遠端主機進行三次握手操作,這種有連線的udp套接字可以避免沒有收到資料而導致的recvfrom()阻塞。

2. 繫結套接字到本地位址,呼叫connect()函式建立「連線」

if(bind(serv_sockfd, (struct sockaddr *)&serv_addr, addrlen) == -1)

if(connect(serv_sockfd,(struct sockaddr *)& remote_addr,addrlen)== -1)

繫結位址是必須的, 而對於udp傳輸來說,connect()函式不是必須的

3.  呼叫傳送或者接收函式:

sendto(serv_sockfd,buffer_send,len,0,(struct sockaddr *)&remote_addr,addrlen);
說明:

linux下BIND VIEW實現雙線智慧型解析

1 軟體列表 bind 9.3.2 ftp ftp.isc.org isc bind9 9.3.2 bind 9.3.2.tar.gz ftp ftp.isc.org isc bind9 9.4.0a6 bind 9.4.0a6.tar.gz 2 安裝bind 9 安裝bind9 tar zxvf ...

基於UDP的多執行緒網路資料報收發測試程式

這段程式同樣用來測試使用recvmmsg 與sendmmsg 後的丟包率,只不過這次用pthread create 建立了4個執行緒,使用g client.c o client lpthread編譯。由於第一次用pthread create 函式,不是很熟悉,程式中有不足的地方還望指出。檔案一 wr...

linux下基於QT的串列埠程式

qt5發布之前,qt實現串列埠通訊一般是採用第三方類庫qextserialport。qt5發布後自帶了qtserialport 能夠支援串列埠通訊。一 qt5.0以下版本 1.在工程中引入4個檔案。qextserialbase.cpp和qextserialbase.h 以及posix qextser...