乙個Linux下的TCP服務2

2021-10-24 19:59:19 字數 3041 閱讀 9311

為了優化 《乙個linux下的tcp服務1> 的效率, 本篇用epoll多路io復用技術, 並設定et模式, 檔名為epoll.c.

該檔案不僅包含了服務端**, 還包含客戶端**, 這可以通過編譯引數compile_server來控制. 同時可以指定客戶端數量, 具體**如下:

// epoll.c

#include #include #include #include #include #include #include #include #include #include #include #include int setnonblock(int fd)

flags |= o_nonblock;

if (fcntl(fd, f_setfl, flags) == -1)

return 0;

}int addfd(int efd, int fd, int mode)

int epolletadd(int efd, int fd, int mode)

void epolletdel(int efd, int fd)

void epolletmodifymode(int efd, int fd, int mode)

void connfunc(int efd, int fd)

epolletadd(efd, connfd, epollin | epollet);

}void readfunc(int efd, int fd)

else

return;

}else if (readlen == 0)

#ifndef compile_server

printf("client recv msg: %s\n", buf);

#else

printf("server recv msg: %s\n", buf);

#endif

epolletmodifymode(efd, fd, epollout | epollet);

}void writefunc(int efd, int fd)

void errfunc(int efd, int fd)

int binding(char *ip, int port, int sfd)

int connecting(char *ip, int port, int sfd)

int socketing(char *ip, int port)

#ifndef compile_server

if (connecting(ip, port, sfd) == -1)

#else

if (setsockopt(sfd, sol_socket, so_reuseaddr, (void *)&val, sizeof(int)) == -1)

if (binding(ip, port, sfd) == -1)

if (listen(sfd, 512) == -1)

#endif

return sfd;

faield:

close(sfd);

return -1;

}int server(char *ip, int port)

if ((sockfd = socketing(ip, port)) == -1)

if (epolletadd(epollfd, sockfd, epollin | epollet) == -1)

printf("epoll server start success.\n");

for(;;)

for (int index = 0; index < count; ++index)

else if(activeevents[index].events & epollin)

else if (activeevents[index].events & epollout)

else }}

close(epollfd);

close(sockfd);

return 0;

}int client(char *ip, int port, int nums)

for (int i = 0; i < nums; ++i)

if (epolletadd(epollfd, sockfd, epollout | epollet) == -1)

}printf("epoll client start success.\n");

for(;;)

for (int index = 0; index < count; ++index)

else if (activeevents[index].events & epollout)

else }}

close(epollfd);

close(sockfd);

return 0;

}int main(int argc, char *ar**)

client(ar**[1], atoi(ar**[2]), atoi(ar**[3]));

#else

if (argc != 3)

server(ar**[1], atoi(ar**[2]));

#endif

return 0;

}

先編譯epoll_server, 編譯並啟動, 命令如下:

gcc epoll.c -o epoll_server -dcompile_server -std=c99

./epoll_server 127.0.0.1 6688

再編譯epoll_client, 編譯並啟動, 命令如下:

gcc epoll.c -o epoll_client -std=c99

./epoll_client 127.0.0.1 6688 1024

因為是在同一臺機器, 所有有2048個established, 結果如下, :

Linux下socket程式設計示範(乙個服務

socket程式設計的基礎函式使用請自查詢,本文只給出在linux gcc可編譯執行的socket通訊的伺服器程式與客戶端程式。如下 server端 include include include include include signal include socket include socka...

windows下的乙個C socket伺服器

include 1 以後會用這種方式對特定 進行注釋 include include include include include include include using namespace std pragma comment lib,ws2 32.lib 2 1.include 大家會發現...

Linux下搞了乙個MySQL 伺服器

最近 從原來的blog搬家過來,不是最近了,好多年前的事了 在我的linux上搞了乙個mysql5.0.37版的伺服器,下面記錄一下其中心得 1.安裝 官網上下來2個rpm包 mysql client community 5.0.37 0.rhel3.i386.rpm mysql server co...