epoll實現回射伺服器

2021-09-02 03:54:05 字數 2680 閱讀 1301

/*

使用 epoll 寫的回射伺服器

將從client中接收到的資料再返回給client

*/ #include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define maxline 100

#define open_max 100

#define listenq 20

#define serv_port 5000

#define inftim 1000

void setnonblocking(int sock)

opts = opts|o_nonblock;

if(fcntl(sock,f_setfl,opts)<0) }

int main(int argc, char* argv) }

else

//宣告epoll_event結構體的變數,ev用於註冊事件,陣列用於回傳要處理的事件

struct epoll_event ev, events[20];

//建立乙個epoll的控制代碼,size用來告訴核心這個監聽的數目一共有多大

epfd = epoll_create(256); //生成用於處理accept的epoll專用的檔案描述符

struct sockaddr_in clientaddr;

struct sockaddr_in serveraddr;

listenfd = socket(af_inet, sock_stream, 0);

//把socket設定為非阻塞方式

//setnonblocking(listenfd);

//設定與要處理的事件相關的檔案描述符

ev.data.fd=listenfd;

//設定要處理的事件型別

ev.events=epollin|epollet;

//註冊epoll事件

epoll_ctl(epfd,epoll_ctl_add,listenfd,&ev);

bzero(&serveraddr, sizeof(serveraddr)); /*配置server socket的相關資訊 */

serveraddr.sin_family = af_inet;

char *local_addr="127.0.0.1";

inet_aton(local_addr,&(serveraddr.sin_addr));//htons(portnumber);

serveraddr.sin_port=htons(portnumber);

bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));

listen(listenfd, listenq);

maxi = 0;

for ( ; ; )

//setnonblocking(connfd);

char *str = inet_ntoa(clientaddr.sin_addr);

cout << "accapt a connection from " << str << endl;

//設定用於讀操作的檔案描述符

ev.data.fd=connfd;

//設定用於註冊的讀操作事件

ev.events=epollin|epollet;

//註冊ev

epoll_ctl(epfd,epoll_ctl_add,connfd,&ev); /* 新增 */

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

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

else

std::cout<<"readline error"<} else if (n == 0) //讀入的資料為空

sztemp = "";

sztemp += line;

sztemp = sztemp.substr(0,sztemp.find('\r')); /* remove the enter key */

memset(line,0,100); /* clear the buffer */

//line[n] = '\0';

cout << "readin: " << sztemp << endl;

//設定用於寫操作的檔案描述符

ev.data.fd=sockfd;

//設定用於註冊的寫操作事件

ev.events=epollout|epollet;

//修改sockfd上要處理的事件為epollout

epoll_ctl(epfd,epoll_ctl_mod,sockfd,&ev); /* 修改 */

} else if(events[i].events&epollout) // 如果有資料傳送

} //(over)處理所發生的所有事件

} //(over)等待epoll事件的發生

close(epfd);

return 0;

}

TCP 回射伺服器

tcp reflect server client tcp回射伺服器。學習了 unp 的第五章前面的知識,自己把 敲出來了,加深了理解吧。簡單地說就是,client傳送給server一條訊息 一行文字 server再將同樣地訊息傳送回client。就像這樣 用到的函式和api包括 1 socket ...

Linux C 回射伺服器

回射伺服器就是服務端將客戶端的資料傳送回去。我實現的回射伺服器返回增加了時間。服務端 可以很容易看懂 cpp view plain copy include include include include include include include include include define ...

TCP 回射伺服器

本例為多程序的 tcp 回射程式 服務端 include intmain int argc,char ar close connfd 父程序斷開連線 void str echo int sockfd 套接字 sockaddr in cliaddr,servaddr 網際套接字位址結構,包含協議族 i...