epoll演示樣本

2021-09-07 03:19:24 字數 2746 閱讀 6737

server參考是別人的**

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxbuf 1024

#define maxepollsize 10000

/* setnonblocking - 設定控制代碼為非堵塞方式

*/int setnonblocking(int sockfd)

return 0;}/*

handle_message - 處理每乙個 socket 上的訊息收發

*/int handle_message(int new_fd)

else

/* 處理每乙個新連線上的資料收發結束 */

return len;

}int main()

else

/* 開啟 socket 監聽 */ if ((listener = socket(pf_inet, sock_stream, 0)) == -1) else setnonblocking(listener); bzero(&my_addr, sizeof(my_addr)); my_addr.sin_family = pf_inet; my_addr.sin_port = htons(myport); my_addr.sin_addr.s_addr = inaddr_any; if (bind(listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) else if (listen(listener, lisnum) == -1) else /* 建立 epoll 控制代碼,把監聽 socket 增加到 epoll 集合裡 */ kdpfd = epoll_create(maxepollsize); len = sizeof(struct sockaddr_in); ev.events = epollin | epollet; ev.data.fd = listener; if (epoll_ctl(kdpfd, epoll_ctl_add, listener, &ev) < 0) else curfds = 1; while (1) /* 處理全部事件 */ for (n = 0; n < nfds; ++n) else setnonblocking(new_fd); ev.events = epollin | epollet; ev.data.fd = new_fd; if (epoll_ctl(kdpfd, epoll_ctl_add, new_fd, &ev) < 0) curfds++; } else } } } close(listener); return 0; }

client**

// echo_client.cpp

// g++ -o echo_client -o3 echo_client.cpp -lboost_system -lboost_thread

#include namespace asio = boost::asio;

using asio::ip::tcp;

#include #include #include #include #include#includefile* g_hlog = 0;

class session

: public boost::enable_shared_from_this

tcp::socket& socket()

void start(int nindex)

void handle_write(const boost::system::error_code& ec, std::size_t bytes_transfered)

else

}void handle_read(const boost::system::error_code& ec, std::size_t bytes_transfered)

}private:

tcp::socket socket_;

int m_nindex;

char output_buffer_[50];

char input_buffer_[50];

};void handle_connect(boost::shared_ptrsession_ptr, int nindex, const boost::system::error_code& ec)

else

}int main(/*int argc, char* argv*/)

io.run();

gettimeofday(&time2, 0);

std::cout << "has time:" << double((time2.tv_sec-time1.tv_sec)+(time2.tv_usec-time1.tv_usec)/1000000.0) << std::endl;

fprintf(g_hlog, "has time: %f s", double((time2.tv_sec-time1.tv_sec)+(time2.tv_usec-time1.tv_usec)/1000000.0));

fclose(g_hlog);

}

linux預設最大的檔案控制代碼數是1024,須要改動此值才幹正常測試。開啟終端執行例如以下命令

echo ulimit -n 65535 >> /etc/profile
登出賬戶並又一次登入能夠。

隨機樣本,方便樣本與資源回應樣本

隨機樣本 random sample 是指來自總體的 能夠正確反映總體情況的元素總稱。滿足如下條件 1 被研究的總體要有明確的定義。2 總體的每個個體有乙個已知的概率包含在該樣本中。3 抽樣過程中必須遵循隨機原則。方便樣本 convenient sample 是指研究者出於方便性的原因而選取的 唾手...

epoll之二 epoll實戰

int epoll create int size epoll create返回 乙個控制代碼,之後epoll的 使用都將依靠這個 控制代碼 來 標識,引數 size是告訴epoll所要處理的大致事件數目,不再使用epoll時,必須呼叫close 關閉這個控制代碼。size這個引數只是 告訴核心這個...

epoll邊緣觸發 Epoll筆記

下圖為epoll的流程圖 epoll一共兩種模式,水平觸發 lt 和邊緣觸發 et 主要的區別在於對讀,寫資料的處理 lt初始化 epoll ctrl connect socket,epollin,add lt讀 void lt handle read if n 0 errno eagain lt寫...