00001
00002
00003
00004
00005
00006
00007
00008 #include "ibrcommon/config.h"
00009 #include "ibrcommon/net/tcpserver.h"
00010 #include <sys/types.h>
00011 #include <sys/socket.h>
00012 #include <arpa/inet.h>
00013 #include <fcntl.h>
00014 #include <errno.h>
00015 #include <sys/poll.h>
00016 #include <string.h>
00017
00018 namespace ibrcommon
00019 {
00020 tcpserver::tcpserver(NetInterface net, int port)
00021 : _socket(0), _closed(false)
00022 {
00023 struct sockaddr_in sock_address;
00024 bzero((char *) &sock_address, sizeof(sock_address));
00025
00026
00027 sock_address.sin_family = AF_INET;
00028
00029
00030 net.getAddress(&sock_address.sin_addr);
00031
00032
00033 sock_address.sin_port = htons(port);
00034
00035
00036 _socket = socket(sock_address.sin_family, SOCK_STREAM, 0);
00037
00038
00039 if (_socket < 0)
00040 {
00041 throw SocketException("TCPConvergenceLayer: cannot create listen socket");
00042 }
00043
00044
00045 if ( bind(_socket, (struct sockaddr *) &sock_address, sizeof(sock_address)) < 0 )
00046 {
00047
00048 throw SocketException("TCPConvergenceLayer: cannot bind socket");
00049 }
00050
00051
00052 listen (_socket, 5);
00053 }
00054
00055 tcpserver::~tcpserver()
00056 {
00057 close();
00058 }
00059
00060 void tcpserver::close()
00061 {
00062 _closed = true;
00063 ::shutdown(_socket, SHUT_RD);
00064 }
00065
00066 tcpstream* tcpserver::accept()
00067 {
00068 struct sockaddr_in cliaddr;
00069 socklen_t len;
00070 len = sizeof(cliaddr);
00071
00072 int ret = ::accept(_socket, (struct sockaddr *) &cliaddr, &len );
00073
00074 if (ret > 0)
00075 {
00076 return new tcpstream(ret);
00077 }
00078
00079 throw SocketException("socket closed");
00080 }
00081 }