C 網路程式設計(3)

2021-08-02 11:25:01 字數 2175 閱讀 8574

**重點內容**epolloneshot模式

即使我們使用et模式,乙個socket上的某個事件還是可能被觸發多次。這在併發程式中就會引起乙個問題。比如乙個執行緒(或程序,下同)在讀取完某個socket上的資料後開始處理這些資料,而在資料的處理過程中該socket上又有新資料可讀(epollin再次被觸發),此時另外乙個執行緒被喚醒來讀取這些新的資料。於是就出現了兩個執行緒同時操作乙個socket的局面。這當然不是我們期望的。我們期望的是乙個socket連線在任一時刻都只被乙個執行緒處理。這一點可以使用epoll的epolloneshot事件實現。

對於註冊epolloneshot事件的檔案描述符,作業系統最多觸發其上註冊的乙個可讀、可寫或者異常事件。這樣,當乙個執行緒在處理某個socket時,其他執行緒是不可能有機會操作該socket的。但反過來思考,註冊了epolloneshot事件的socket一旦被某個執行緒處理完畢,該執行緒就應該立即重置這個socket上的epolloneshot事件,以確保這個socket下次一次可讀時,其epollin事件能被觸發,進而讓其他工作執行緒有機會繼續處理這個socket。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max_event_number 1024

#define buffer_size 1024

struct fds

;int setnonblocking( int fd )

void addfd( int epollfd, int fd, bool oneshot )

epoll_ctl( epollfd, epoll_ctl_add, fd, &event );

setnonblocking( fd );

}void reset_oneshot( int epollfd, int fd )

void* worker( void* arg )

else

if( ret < 0 )

}else

}printf( "end thread receiving data on fd: %d\n", sockfd );

}int main( int argc, char* argv )

const

char* ip = argv[1];

int port = atoi( argv[2] );

int ret = 0;

struct sockaddr_in address;

bzero( &address, sizeof( address ) );

address.sin_family = af_inet;

inet_pton( af_inet, ip, &address.sin_addr );

address.sin_port = htons( port );

int listenfd = socket( pf_inet, sock_stream, 0 );

assert( listenfd >= 0 );

ret = bind( listenfd, ( struct sockaddr* )&address, sizeof( address ) );

assert( ret != -1 );

ret = listen( listenfd, 5 );

assert( ret != -1 );

epoll_event events[ max_event_number ];

int epollfd = epoll_create( 5 );

assert( epollfd != -1 );

addfd( epollfd, listenfd, false );

while( 1 )

for ( int i = 0; i < ret; i++ )

else

if ( events[i].events & epollin )

else}}

close( listenfd );

return

0;}

c 網路程式設計3 UDP程式設計

一.概念 udp是傳輸層中面向無連線的協議,所以udp丟包後是不會重傳的,而且他在程式設計上服務端和客戶端是沒有區別的,有的只是 虛擬上 的服務端和客戶端,他在程式設計的實現上也很簡單,不像tcp那麼複雜。二.udp終端的程式設計 由於udp在服務端和客戶端是一樣的,所以稱為udp終端,程式設計步驟...

網路程式設計3

短連線 長連線inetaddress類 只表示位址 主機 inetsocketaddress類 主機名 埠 netoworkinte ce類 服務端 客戶端 通訊程式設計關注的三件事 提供服務的稱為服務端 連線服務的稱為客戶端 某個類有server serversocket,那麼這個類往往是給服務端...

網路程式設計總結 3

iphone的cfnetwork程式設計比較艱深。我選擇使用asyncsocket開源庫來開發,下面介紹一些簡單的使用,並給出我寫的乙個簡單的實現模板,只要新增自己的處理 就可以使用了。官方 一.專案新增asyncsocket 2.把asyncsocket庫原始碼加入專案 3.在專案增加cfnetw...