-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmyserver.cpp
More file actions
86 lines (72 loc) · 2.07 KB
/
myserver.cpp
File metadata and controls
86 lines (72 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "myserver.h"
//#include "httphandler.h"
string blank = "HTTP/1.1 200 OK\r\nContent-Length:0\r\nContent-Type:text/html\r\n\r\n";
MyServer::MyServer(int arg_port,char * arg_addr):port(arg_port),addr(arg_addr){
skfd = socket(AF_INET, SOCK_STREAM, 0);
if(skfd<0){
cout<<"create error"<<endl;
perr();
}
memset(&sa, '\0', sizeof(struct sockaddr));
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
sa.sin_addr.s_addr = inet_addr(addr);
int optval = 1;
int state = -1;
state = setsockopt(skfd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
if(state<0){
cout<<"setsockopt fail"<<endl;
perr();
}
state = bind(skfd, (struct sockaddr *)&sa, sizeof(struct sockaddr));
if(state<0){
cout<<"bind error"<<endl;
perr();
}
listen(skfd, SOMAXCONN);
}
MySocket * MyServer::myaccept(){
int sk_cli;
int len=sizeof(struct sockaddr);
struct sockaddr sa_cli;
struct sockaddr_in *sai_cli;
sk_cli = accept(skfd, &sa_cli, (socklen_t *)&len);
if(sk_cli==-1){
cout<<"accept fail"<<endl;
perr();
return NULL;
}
sai_cli = (struct sockaddr_in *)&sa_cli;
printf("Connect from:%s[%d]\n",inet_ntoa(sai_cli->sin_addr),ntohs(sai_cli->sin_port));
MySocket * ms = new MySocket(sk_cli, &sa_cli);
return ms;
}
vector<MySocket *> MyServer::selectaccept(){
int rsize;
struct timespec ts{0,250000000};
struct sockaddr sa_cli;
fd_set rfd;
int sk_cli;
int len;
vector<MySocket *> res;
FD_ZERO(&rfd);
FD_SET(skfd, &rfd);
rsize = pselect(FD_SETSIZE,&rfd, NULL, NULL, &ts,NULL);
if(rsize==-1){
}else if(rsize == 0){
}else{
for(int i=0; i<rsize; i++){
sk_cli = accept(skfd, &sa_cli, (socklen_t *)&len);
if(sk_cli==-1){
cout<<"accept fail"<<endl;
perr();
}else{
res.push_back(new MySocket(sk_cli, &sa_cli));
}
}
}
return res;
}
MyServer::~MyServer(){
close(skfd);
}