為了優化 《乙個linux下的tcp服務1> 的效率, 本篇用epoll多路io復用技術, 並設定et模式, 檔名為epoll.c.
該檔案不僅包含了服務端**, 還包含客戶端**, 這可以通過編譯引數compile_server來控制. 同時可以指定客戶端數量, 具體**如下:
先編譯epoll_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;
}
gcc epoll.c -o epoll_server -dcompile_server -std=c99再編譯epoll_client, 編譯並啟動, 命令如下:./epoll_server 127.0.0.1 6688
gcc epoll.c -o epoll_client -std=c99因為是在同一臺機器, 所有有2048個established, 結果如下, :./epoll_client 127.0.0.1 6688 1024
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...