Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
nicolas-arnaud | ac3857755f | 2 years ago |
nicolas-arnaud | 4c626e4b8a | 2 years ago |
13 changed files with 248 additions and 113 deletions
@ -0,0 +1,11 @@ |
|||
#pragma once |
|||
#include "webserv.hpp" |
|||
|
|||
class Sock6: public Socket { |
|||
struct sockaddr_in6 _addr6; |
|||
public: |
|||
Sock6(listen_t listen); |
|||
~Sock6(); |
|||
int launch(); |
|||
void refresh(Env *env); |
|||
}; |
@ -0,0 +1,82 @@ |
|||
#include "webserv.hpp" |
|||
|
|||
Sock6::Sock6(listen_t listen) : Socket(listen) { _type = AF_INET6; } |
|||
|
|||
int Sock6::launch() { |
|||
int opt = 1; |
|||
string ip = _listen.ip; |
|||
int port = _listen.port; |
|||
|
|||
_addr6.sin6_family = AF_INET6; |
|||
inet_pton(AF_INET6, ip.c_str(), (void *)&(_addr6.sin6_addr.s6_addr)); |
|||
_addr6.sin6_port = htons(port); |
|||
_master_socket = socket(_addr6.sin6_family, SOCK_STREAM, 0); |
|||
|
|||
if (_master_socket == 0) { |
|||
cout << "Socket creation: " << strerror(errno) << "\n"; |
|||
return (EXIT_FAILURE); |
|||
} |
|||
int opt_ret = setsockopt(_master_socket, SOL_SOCKET, SO_REUSEADDR, |
|||
(char *)&opt, sizeof(opt)); |
|||
if (opt_ret < 0) { |
|||
cout << "Sockopt: " << strerror(errno) << "\n"; |
|||
return (EXIT_FAILURE); |
|||
} |
|||
|
|||
if (bind(_master_socket, (struct sockaddr *)&_addr6, sizeof(_addr6)) < 0) { |
|||
cout << "Bind: " << strerror(errno) << "\n"; |
|||
return (EXIT_FAILURE); |
|||
} |
|||
cout << "Listener " << ip << " on port " << port << "\n"; |
|||
|
|||
if (listen(_master_socket, 3) < 0) { |
|||
cout << "Listen: " << strerror(errno) << "\n"; |
|||
return (EXIT_FAILURE); |
|||
} |
|||
cout << "Socket::_master_socket: " << _master_socket << "\n"; |
|||
if (_master_socket < _min_fd) |
|||
_min_fd = _master_socket; |
|||
_amount++; |
|||
return (EXIT_SUCCESS); |
|||
} |
|||
|
|||
void Sock6::refresh(Env *env) { |
|||
|
|||
std::vector<int>::iterator it; |
|||
int valread; |
|||
int addrlen = sizeof(_addr6); |
|||
char buffer[10000]; |
|||
if (FD_ISSET(_master_socket, &_readfds)) { |
|||
int new_socket = accept(_master_socket, (struct sockaddr *)&_addr6, |
|||
(socklen_t *)&addrlen); |
|||
if (new_socket < 0) { |
|||
cout << "Accept: " << strerror(errno) << "\n"; |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
#ifdef __APPLE__ |
|||
fcntl(new_socket, F_GETNOSIGPIPE); |
|||
#endif |
|||
cout << "New connection, socket fd is " |
|||
<< new_socket |
|||
// << ", ip is : " << inet_ntoa(_addr6.sin6_addr)
|
|||
<< ", port : " << ntohs(_addr6.sin6_port) << "\n"; |
|||
_clients.push_back(new_socket); |
|||
} |
|||
for (it = _clients.begin(); it < _clients.end(); it++) { |
|||
if (FD_ISSET(*it, &_readfds)) { |
|||
valread = read(*it, buffer, 10000); |
|||
if (valread == 0) { |
|||
getpeername(*it, (struct sockaddr *)&_addr6, |
|||
(socklen_t *)&addrlen); |
|||
// cout << "Host disconnected, ip " <<
|
|||
//inet_ntoa(_addr6.sin6_addr)
|
|||
// << ", port " << ntohs(_addr6.sin6_port) << "\n";
|
|||
close(*it); |
|||
_clients.erase(it); |
|||
} else { |
|||
buffer[valread] = '\0'; |
|||
answer(env, *it, buffer); |
|||
} |
|||
} |
|||
} |
|||
} |
Loading…
Reference in new issue