高併發的socket實現

2021-06-22 19:31:00 字數 2163 閱讀 7539

方法1  使用select 

方法2  使用epoll

首先linux平台下的socket最大連線數是1024,其實去除一些系統用的文字描述符,就會少於1024了,但是一般的伺服器1000多個連線哪能夠呢?用命令ulimit -n可以查詢最大檔案描述符 也可以改寫 ulimit -n 65536

select是i/o多路轉換技術

伺服器端

#include #include #include #include #include #include #include #include int main()

for(fd = 0; fd < fd_setsize; fd++)

else

else }}

}}

}

客戶機

/*  make the necessary includes and set up the variables.  */

#include #include #include #include #include #include #include int main()

/* we can now read/write via sockfd. */

memset(snd_buf,0,1024);

sprintf(snd_buf,"my pid is %d",getpid());

len=strlen(snd_buf);

if(len>0)

while(1)

close(sockfd);

exit(0);

}

shell 啟動**

#!/bin/bash

./select &

for (( i=0;i<2200;i++))

do ./client &

done

shell 結束**

#!/bin/bash

killall client

killall select

epoll**

#include #include #include #include #include #include #include #include #include #define m_maxfd 1024

struct epoll_event ev,events[m_maxfd];

int epfd;

int main()

{ int server_sockfd, client_sockfd;

int server_len, client_len;

struct sockaddr_in server_address;

struct sockaddr_in client_address;

int result;

char rec_buf[1024];

int nfds,i,sockfd;

server_sockfd = socket(af_inet, sock_stream, 0);

server_address.sin_family = af_inet;

server_address.sin_addr.s_addr = htonl(inaddr_any);

server_address.sin_port = htons(5555);

server_len = sizeof(server_address);

bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

listen(server_sockfd, 5);

epfd=epoll_create(m_maxfd);

ev.data.fd = server_sockfd;

ev.events = epollin | epollet;

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

memset(rec_buf,0,1024);

while(1) {

int nread;

nfds = epoll_wait(epfd,events,1024,500);

for(i=0;i

高併發快取實現

private static concurrenthashmap gloddeptfutumap new concurrenthashmap future 介面允許表示已經完成的任務 正在執行過程中的任務或者尚未開始執行的任務。futuretask 類實現了 future,幷包含一些建構函式,允許將...

gevent實現高併發

gevent是python的協程模組,協程可以理解成更輕量化的執行緒。因為效能測試工具的一些限制,就自己萌發了自己寫效能測試工具的念想,當然,寫的比較簡單,比如缺少效能指標的收集,慢慢的優化 出來,這個只是為了拿出來練練手 import gevent import requests import t...

怎麼實現高併發系統

脫離了業務的系統架構都是在紙上談兵,真正在複雜業務場景而且還高併發的時候,那系統架構一定不是那麼簡單的,用個 redis,用 mq 就能搞定?當然不是,真實的系統架構搭配上業務之後,會比這種簡單的所謂 高併發架構 要複雜很多倍。可以分為以下 6 點 將乙個系統拆分為多個子系統,用 dubbo 來搞。...