作为后端研发人员,竟然没搞清楚C/S模式,惭愧。。不爽。。
部分代码参考 http://blog.csdn.net/shanshanpt/article/details/7383400 感谢~~
- server.cpp
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/socket.h> // for socket
#include <netinet/in.h> // for sockaddr_in
#include <sys/epoll.h> // for epoll
#include <fcntl.h> // for nonblocking
#include <sys/resource.h> // for 最大连接数需要setrlimit
#define MAXEPOLL 10000 // 对服务器来说,这个值可以很大
#define MAXLINE 1024
#define PORT 6000
#define MAXBACK 1000
int setnonblocking(int fd) {
if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFD,0) | O_NONBLOCK) == -1) {
printf("set blocking error: %d\n", errno);
return -1;
}
return 0;
}
int main() {
int listen_fd;
int conn_fd;
int epoll_fd;
int nread;
int cur_fds; // 当前已经存在的fd数量
int wait_fds; // epoll_wait的返回值
int i;
struct sockaddr_in servaddr;
struct sockaddr_in cliaddr;
struct epoll_event ev;
struct epoll_event evs[MAXEPOLL];
struct rlimit rlt; // 设置连接数所需
char buf[MAXLINE];
socklen_t len = sizeof(struct sockaddr_in);
// 1.设置每个进程允许打开的最大文件数
rlt.rlim_max = rlt.rlim_cur = MAXEPOLL;
if(setrlimit(RLIMIT_NOFILE, &rlt) == -1) {
printf("setrlimit error : %d\n", errno);
exit(EXIT_FAILURE);
}
// 2. 设置server地址
bzero(&servaddr, sizeof(servaddr));
// sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族
servaddr.sin_family = AF_INET;
// INADDR_ANY就是指定地址为0.0.0.0的地址,也就是表示本机的所有IP
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
// 必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字
servaddr.sin_port = htons(PORT);
// 3. 建立套接字
if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("socket error : %d ...\n", errno);
<