00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include "config.h"
00025
00026 #include <cerrno>
00027 #include <cstring>
00028 #include <sys/types.h>
00029 #include <netdb.h>
00030 #include <netinet/in.h>
00031 #include <netinet/tcp.h>
00032 #include <sys/socket.h>
00033 #include <unistd.h>
00034
00035 #include <scalestack/kernel/module.h>
00036 #include <scalestack/network/ip/tcp/connection.h>
00037 #include <scalestack/network/ip/tcp/connection_service.h>
00038
00039 using namespace std;
00040
00041 namespace scalestack
00042 {
00043 namespace network
00044 {
00045 namespace ip
00046 {
00047 namespace tcp
00048 {
00049
00050
00051
00052
00053
00054 connection::connection(event::handler_service& handler_service,
00055 stream_service& stream_service,
00056 int file_descriptor):
00057 network::stream_provider(handler_service, stream_service, file_descriptor)
00058 {
00059 }
00060
00061 connection::connection(event::handler_service& handler_service,
00062 stream_service& stream_service,
00063 const struct addrinfo* addresses):
00064 network::stream_provider(handler_service, stream_service, addresses)
00065 {
00066 }
00067
00068 connection::~connection()
00069 {
00070 if (_addresses != NULL)
00071 freeaddrinfo(const_cast<struct addrinfo*>(_addresses));
00072 }
00073
00074 void connection::set_file_descriptor(int file_descriptor)
00075 {
00076 if (file_descriptor != -1)
00077 {
00078 int return_code = 1;
00079 return_code = setsockopt(file_descriptor, IPPROTO_TCP, TCP_NODELAY,
00080 &return_code, static_cast<socklen_t>(sizeof(int)));
00081 if (return_code == -1 && errno != EOPNOTSUPP)
00082 {
00083 _module.log_error(_("Could not set TCP_NODELAY: %s"), strerror(errno));
00084 shutdown();
00085 return;
00086 }
00087 }
00088
00089 network::stream_provider::set_file_descriptor(file_descriptor);
00090 }
00091
00092 }
00093 }
00094 }
00095 }