epoll邊緣觸發_C++回聲服務器_9-epoll邊緣觸發模式版本服務器

epoll默認情況下是水平觸發模式,這次將epoll設置為邊緣觸發模式來實現服務器,而客戶端直接使用完美回聲服務器的客戶端。

服務器代碼

#include

#include

#include

#include

#include

#include

#include

#include

#include

const int BUF_SIZE = 4;

const int EPOLL_SIZE = 50;

void setnonblockingmode(int fd);

void error_handling(const char *buf);

int main(int argc, char *argv[]) {

int server_sock, client_sock;

sockaddr_in server_addr, client_addr;

socklen_t addr_size;

ssize_t str_len;

int i;

char buf[BUF_SIZE];

epoll_event *ep_events;

epoll_event event;

int epfd, event_cnt;

if (argc != 2) {

printf("Usage : %s \n", argv[0]);

exit(1);

}

server_sock = socket(PF_INET, SOCK_STREAM, 0);

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

server_addr.sin_port = htons(atoi(argv[1]));

if (bind(server_sock, (sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

error_handling("bind() error");

exit(1);

}

if (listen(server_sock, 5) == -1) {

error_handling("listen() error");

}

epfd = epoll_create(EPOLL_SIZE);

ep_events = (epoll_event*)malloc(sizeof(epoll_event) * EPOLL_SIZE);

event.events = EPOLLIN;

event.data.fd = server_sock;

epoll_ctl(epfd, EPOLL_CTL_ADD, server_sock, &event);

while (1) {

event_cnt = epoll_wait(epfd, ep_events, EPOLL_SIZE, -1);

if (event_cnt == -1) {

puts("epoll_wait() error");

break;

}

for (int i = 0; i < event_cnt; ++i) {

if (ep_events[i].data.fd == server_sock) {

addr_size = sizeof(client_addr);

client_sock = accept(server_sock, (sockaddr*)&client_addr, &addr_size);

setnonblockingmode(client_sock); // 設置client socket為非阻塞模式

event.events = EPOLLIN | EPOLLET; // 設置epoll邊緣觸發

event.data.fd = client_sock;

epoll_ctl(epfd, EPOLL_CTL_ADD, client_sock, &event);

printf("connect client: %d\n", client_sock);

} else {

while (1) { // 將數據讀完為止

str_len = read(ep_events[i].data.fd, buf, BUF_SIZE);

if (str_len == 0) {

epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL);

close(ep_events[i].data.fd);

printf("closed client: %d\n", ep_events[i].data.fd);

} else if (str_len < 0) {

if (errno == EAGAIN) { // 已無數據

break;

}

}

else {

write(ep_events[i].data.fd, buf,str_len);

}

}

}

}

}

close(server_sock);

close(epfd);

return 0;

}

// 將文件描述符設置為非阻塞

void setnonblockingmode(int fd) {

int flag = fcntl(fd, F_GETFL, 0);

fcntl(fd, F_SETFL, flag | O_NONBLOCK);

}

項目代碼

參考

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457328.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用dbstart和dbshut腳本自動啟動和停止數據庫的問題

客戶的兩臺IBM Power 740小型機使用HACMP軟件創建互備關系的數據庫服務器&#xff0c;每臺小型機運行一個數據庫&#xff0c;任何一臺服務器出現故障宕機&#xff0c;另一臺小型機應該立即接管&#xff0c;且要一并接管數據庫&#xff0c;這時在一臺小型機上就運行了兩個數據庫…

在Windows下不使用密碼遠程登陸Linux

在登陸Linux進行管理的時候我們通常會使用用戶名和密碼進行登陸&#xff0c;這樣一來是比較麻煩&#xff0c;二來是不安全&#xff0c;為了解決這個問題&#xff0c;我們可以使用公私鑰 (public keys和private keys)進行認證。簡單來說公鑰存放在服務器上&#xff0c;私鑰存放在…

dto 是只給前端需要的數據嗎_DO、VO、DTO...XXOO,你弄明白了么

技術公眾號&#xff1a;Java In Mind(Java_In_Mind),歡迎關注&#xff01;背景我相信&#xff0c;剛開始學習接觸企業代碼的時候&#xff0c;一定會發現&#xff0c;工程中充斥著各種XO&#xff1a;DO、VO、DTO、DAO&#xff0c;還有各種名詞&#xff1a;POJO&#xff0c;JavaB…

Javascript判斷object還是list/array的類型(包含javascript的數據類型研究)

前提&#xff1a;先研究javascript中的變量有幾種&#xff0c;參考&#xff1a; http://www.w3school.com.cn/js/js_datatypes.asp http://glzaction.iteye.com/blog/1285147 測試1&#xff1a; typeof關鍵字 var obj {test:test}; typeof obj;//輸出object var list [{test:t…

Core Data

簡介 Core Data是iOS5之后才出現的一個框架&#xff0c;它提供了對象-關系映射(ORM)的功能&#xff0c;即能夠將OC對象轉化成數據&#xff0c;保存在SQLite數據庫文件中&#xff0c;也能夠將保存在數據庫中的數據還原成OC對象。在此數據操作期間&#xff0c;我們不需要編寫任何…

tbase同步mysql_mysql主從同步

MySQL主從介紹MySQL主從叫做Replication、AB復制&#xff0c;A和B做主從后&#xff0c;在A上寫數據。B上也會同步A的數據&#xff0c;兩者實現實時同步MySQL是基于binlog日志來同步的&#xff0c;主上必須開啟binlog才能進行主從同步&#xff0c;同步過程大概有三個步驟(1)主將…

2017將轉行進行到底

2016 年說著轉行&#xff0c;最后還是在匆匆中找了一份老本行&#xff0c;此刻的心情還是無愛&#xff0c;畢竟螺絲一直分不清啊&#xff0c;不喜歡就是不喜歡。看了django的教程&#xff0c;不得不感嘆國外的書寫的相對優秀一點&#xff0c;《learning django web development…

mysql中函數是否可以返回多個值_是否可以從mysql函數返回多個值?

我的臟解決方案是&#xff1a;1.連接字符串中的值. 2返回字符串. 3 Splits將字符串返回值.我認為它不優雅,我確信這有局限性,但它適用于簡單的情況還有必要創建分裂函數,因為Mysql沒有這個函數&#xff1a;首先編輯你的功能.CREATE FUNCTION yourFunctionWith2valuesForReturni…

lua自定義迭代器

迭代器 http://www.tutorialspoint.com/lua/lua_iterators.htm 迭代器能夠讓你遍歷某個集合或者容器中的每一個元素。 對于lua來說&#xff0c; 集合通常指代 table&#xff0c; 用于創建變化的數據結構&#xff0c; 類似數組。 Iterator is a construct that enables you to t…

mysql非主鍵索引_主鍵索引和非主鍵索引的區別

1. 什么是最左前綴原則&#xff1f;以下回答全部是基于MySQL的InnoDB引擎例如對于下面這一張表如果我們按照 name 字段來建立索引的話&#xff0c;采用B樹的結構&#xff0c;大概的索引結構如下如果我們要進行模糊查找&#xff0c;查找name 以“張"開頭的所有人的ID&#…

優美的配色方案設計

2019獨角獸企業重金招聘Python工程師標準>>> 怎么做好設計配色一直是個難題&#xff0c;雖然網站上有各種各樣的色庫&#xff0c;但配色仍然至關重要&#xff0c;不得已的話可以親自動手&#xff0c;況且樂趣滿滿。 這個沒有一套標準&#xff0c;所以看自己怎么喜歡…

It's a start!

開始博客之旅轉載于:https://www.cnblogs.com/catchingdream/p/5843172.html

mysql死鎖釋放時間參數_【Mysql】mysql 事務未提交導致死鎖 Lock wait timeout exceeded; try restarting transaction 解決辦法...

問題場景問題出現環境&#xff1a;1、在同一事務內先后對同一條數據進行插入和更新操作&#xff1b;2、多臺服務器操作同一數據庫&#xff1b;3、瞬時出現高并發現象&#xff1b;不斷的有一下異常拋出&#xff0c;異常信息&#xff1a;org.springframework.dao.CannotAcquireLo…

ORACLE sqlplus設置行數和寬度

1) 查看目前的pagesize,默認是14:Sqlplus代碼show pagesize; 2) 將pagesize設置好100,則可以一次顯示夠多行記錄了:Sqlplus代碼set pagesize 100; 2. 設置行的寬度1) 查看目前的linesize,默認是80:Sqlplus代碼show linesize; 2) 設置成100或者更寬都可以:Sqlplus代碼set li…

mysql關系模式怎么畫_關系數據庫與mysql

表下面是阿里的mysql設計原則&#xff0c;可以參考&#xff0c;不一定按照阿里規則&#xff0c;但一個團隊一定要有規則&#xff0c;如果現在沒有規則&#xff0c;從現在開始&#xff0c;慢慢推廣&#xff0c;適應1.【強制】表達是與否概念的字段&#xff0c;必須使用 is_xxx的…

Javascript 構造函數模式、原型模式

前兩天寫完組合繼承&#xff0c;打算總結一下原型繼承的&#xff0c;不過今天看了一下工廠模式、構造函數模式和原型模式&#xff0c;覺得有必要總結一下以加深印象。 ———————————————————————————————————————————————————…

2016年CCF第七次測試 俄羅斯方塊

1 //2016年CCF第七次測試 俄羅斯方塊2 // 這道小模擬題還是不錯3 // 思路&#xff1a;處理出輸入矩陣中含1格子的行數和列數4 // 再判是否有一個格子碰到底部&#xff0c;否則整體再往下移動一步&#xff0c;如果有一個格子不能移動&#xff0c;要返回到前一步5 6 #include <…

springmvc視圖解析器_SpringMVC視圖及REST風格

什么是視圖解析器&#xff1f;springMVC用于處理視圖最重要的兩個接口是ViewResolver和View。ViewResolver的主要作用是把一個邏輯上的視圖名稱解析成一個真的的視圖&#xff0c;而SpringMVC中用于把View對象呈現給客戶端的是View對象本身&#xff0c;而ViewResolver只是把邏輯…

mysql5.7.x 1251_MySql-8.0.x免安裝版下載與配置,Navicat打開數據庫鏈接報錯1251的解決辦法...

概述MySQL從5.7一下子跳到了MySQL8.0, 其中的變化必然是很大的, 這里就不說了, 本文主要講解最新版MySQL安裝的事情.實際上5.7版本后的mysql免安裝版都是沒有data文件和my.ini文件的&#xff0c;下面再具體說明怎么生成&#xff0c;注意不能自己手動新建.下載下載程序必然去官網…

To install 64-bit ODBC drivers

為了更充分的利用硬件資源&#xff0c;我想很多人都開使用64位操作系統了&#xff0c;同時你可以也發現了在64位操作系統上ODBC的驅動找不到了&#xff0c;所以ODBC的東西都沒法用了。 因為2007以前版本的Office只有32位版本&#xff0c;所以我們不能在64位系統上使用ODBC。使用…