參考:
使用poll實現的io多路復用服務端和客戶端。
客戶端通過子程序建立多個客戶端連線。
客戶端每隔1秒向服務端傳送乙個時間戳,
服務端接收到時間戳以後,儲存在本地的檔案中,
乙個客戶端對應乙個儲存檔案,
並將接收到的時間戳返回給客戶端。
**:服務端:
#include #include #include #include #include #include #include #include #include #include #include #include #include #define ip_addr "127.0.0.1"
#define port 59999
#define listen_q 5
#define open_max 100000
#define inftim -1
#define max_line 1024
static int socket_bind(const char* ip, int port);
static void do_poll(int ln_fd);
static void handle_conn(struct pollfd* conn_fds, int num, int* files);
int main()
static int socket_bind(const char* ip, int port)
bzero(&_addr, sizeof(_addr));
_addr.sin_family = af_inet;
inet_pton(af_inet, ip, &_addr.sin_addr);
_addr.sin_port = htons(port);
if(bind(ln_fd, (struct sockaddr*)&_addr, sizeof(_addr)) == -1)
return ln_fd;
}static void do_poll(int ln_fd)
else
break;}}
fflush(stdout);
if(i == open_max)
clients[i].events = pollin;
nmax = (i > nmax ? i : nmax);
if(--nready <= 0)
} handle_conn(clients, nmax, files); }}
static void handle_conn(struct pollfd* conn_fds, int num, int* files)
write(files[i], buf, n);
write(conn_fds[i].fd, buf, n);
} }}
客戶端:
#include #include #include #include #include #include #include #include #include #include #define max_line 1024
#define ip_addr "127.0.0.1"
#define serv_port 59999
#define max(a,b) (a>b)?a:b
static void do_conn();
static void handle_conn(int sockfd);
int main(int args, char* argv)
else if(fpid == 0)
else
} return 0;
}static void do_conn()
handle_conn(sockfd);
}static void handle_conn(int sockfd)
; char recv_line[max_line] = ;
struct pollfd pfds[1];
pfds[0].fd = sockfd;
pfds[0].events = pollin|pollout;
while(1)
else if(ret < 0)
//printf("[%d] recv=%s\n", (int)getpid(), recv_line);
} if(pfds[0].revents & pollout) ;
sprintf(dt, "%d\n", _time);
memcpy(send_line, dt, strlen(dt));
int ret = write(sockfd, send_line, strlen(send_line));
if(ret < 0)
} sleep(1);
} shutdown(sockfd, shut_wr);
}
poll實現I O多路復用
poll函式原型 引數說明 fds 是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符 每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便 特別是對於socket連線比較多的情況下,在一定程度上可以提高處理的效率 這一點與select 函式不同,呼叫...
I O多路復用 poll
函式結構 int poll struct pollfd fds,nfds t nfds,int timeout 引數 返回值 和select一模一樣 events和revents events 關注事件 讀就緒 寫就緒 異常 輸入的時候起作用 revents 輸出結果,輸出的時候起作用 輸入輸出引數...
I O多路復用之poll
poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...