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寫...