**重點內容**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...