EPOLLIN和EPOLLOUT究竟什麼時候觸發?

2021-06-19 07:59:57 字數 2724 閱讀 9060

server.cpp

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define maxline 1024

#define serv_port 8877

//發生了致命錯誤,輸出錯誤後立即退出

void error_quit(const char *str)   

int main(void)     

//如果有資料傳送   

else if(events[i].events & epollout)    

//如果是已經連線的使用者,並且收到資料,那麼進行讀入。     

else if(events[i].events & epollin)     

else     

error_quit("read error");   

}      

//如果讀入的資料為空     

else if ( n == 0 )    

/*else   

*/    

}    //如果有資料傳送   

else if(events[i].events & epollerr)    

else if(events[i].events & epollhup)    

}   

}   

return 0;     

}    

client.cpp

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int main ( int argc, char ** argv )

int iret = -1;

string shost = argv[1];

int iport = atoi( argv[2] );

string skind = argv[3];

string sneedcrlf = argv[4];

string  sin  = argv[5];

int sock_fd = -1, serverlen;

struct sockaddr_in server_addr;

if ( skind == "udp" )

else if ( skind == "tcp" )

if ( sock_fd == -1 )

int ilen = sin.length() ;

if ( skind == "tcp" )

}cout <<  "connect to server " << shost << ":" << iport << endl;

sleep( 10 );

if  ( sendto( sock_fd, sin.c_str(), ilen, 0, (struct sockaddr *)&server_addr, serverlen ) < 0)

cout <<  "send to server " << shost << ":" << iport << endl;

char sbuffer[1024] ;

sleep( 10 );

int isize = ::recvfrom( sock_fd, sbuffer, 1024 , 0,

(struct sockaddr*)&server_addr, (socklen_t*)&serverlen);

cout << "recv return: " << isize << " bytes " << endl;

cout << sbuffer << endl;

sleep( 10 );

close( sock_fd );

cout <<  " send finished, close socket. " << endl;

return 0;

}開乙個視窗執行server

./server

再開乙個視窗執行client

./client  10.6.208.181 8877 tcp y hello

這時server端會列印

epollout event

write 10 bytes. errno0, str is success

過10秒

epollout event

write 10 bytes. errno0, str is success

過10秒

下面三行同時列印

epollout event

write 10 bytes. errno0, str is success

epollin event

可見 如果同時監聽epollin|epollout,客戶端connect的時候會產生一次epollout|epollin;客戶端send的時候會產生一次epollout|epollin;客戶端recv的時候沒有任何事件產生,客戶端關閉時會產生epollout|epollin|epollhup|epollerr四個事件

ET模式下EPOLLIN和EPOLLOUT同時返回

et模式下 這是自己實驗時,發生的乙個現象,同時註冊epollin和epollout事件,當讀事件就緒時,返回的flag帶有epollin和epollout。對於我們來說,判斷讀事件和寫事件就緒的條件是reported後的flag。現在et模式下。當讀事件由低電平到高電平時,讀事件就緒,可以理解。但...

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...

rpx和樣式和class和flex

5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...