123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /*
- ** JNetLib
- ** Copyright (C) 2000-2013 Nullsoft, Inc.
- ** Author: Justin Frankel, Ben Allison
- ** File: listen.cpp - JNL TCP listen implementation
- ** License: see jnetlib.h
- */
- #include "netinc.h"
- #include "util.h"
- #include "listen.h"
- #include "foundation/error.h"
- JNL_Listen::JNL_Listen()
- {
- m_port=0;
- m_socket=-1;
- }
- int JNL_Listen::Initialize(unsigned short port, sockaddr *which_interface, int family)
- {
- m_port = port;
- char portString[32] = {0};
- sprintf(portString, "%d", (int)port);
- addrinfo *res;
- addrinfo hints;
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = family;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_NUMERICHOST | AI_PASSIVE;
- hints.ai_addr = which_interface?which_interface:INADDR_ANY;
- if (getaddrinfo(NULL, portString, &hints, &res) == 0)
- {
- int ret = Initialize(res, 0);
- freeaddrinfo(res);
- return ret;
- }
- else
- {
- return NErr_Error;
- }
- }
- int JNL_Listen::Initialize(addrinfo *address, size_t index)
- {
- addrinfo *res = address;
- while (index--)
- {
- res = res->ai_next;
- if (!res)
- return NErr_EndOfEnumeration;
- }
- m_socket = ::socket(res->ai_family,res->ai_socktype, res->ai_protocol);
- if (m_socket < 0)
- {
- freeaddrinfo(res);
- return NErr_Error;
- }
- else
- {
- SET_SOCK_BLOCK(m_socket,0);
- #ifndef _WIN32
- int bflag = 1;
- setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &bflag, sizeof(bflag));
- #endif
- if (::bind(m_socket, res->ai_addr, (int)res->ai_addrlen))
- {
- closesocket(m_socket);
- m_socket=-1;
- return NErr_Error;
- }
- else if (::listen(m_socket,8)==-1)
- {
- closesocket(m_socket);
- m_socket=-1;
- return NErr_Error;
- }
- }
- return NErr_Success;
- }
- JNL_Listen::~JNL_Listen()
- {
- if (m_socket>=0)
- {
- closesocket(m_socket);
- }
- }
- JNL_Connection *JNL_Listen::get_connect(size_t sendbufsize, size_t recvbufsize)
- {
- if (m_socket < 0)
- {
- return NULL;
- }
- sockaddr_storage saddr;
- socklen_t length = sizeof(saddr);
- SOCKET s = accept(m_socket, (sockaddr *)&saddr, &length);
- if (s != -1)
- {
- JNL_Connection *c=new JNL_Connection(NULL,sendbufsize, recvbufsize);
- c->connect(s, (sockaddr *)&saddr, length);
- return c;
- }
- return NULL;
- }
- socklen_t JNL_Listen::get_address(sockaddr* address, socklen_t *address_len)
- {
- return getsockname(m_socket, address, address_len);
- }
- unsigned short JNL_Listen::get_port()
- {
- if (!m_port)
- {
- sockaddr_in address;
- socklen_t namelen = sizeof(address);
- if (getsockname(m_socket, (sockaddr *)&address, &namelen) == 0)
- m_port = ntohs(address.sin_port);
- }
- return m_port;
- }
|