/** * Initialize the httpd socket. * * @param[in] sa address and port to listen on * @param[in] sa_len length of sa */ void hio_init(struct sockaddr *sa, socklen_t sa_len) { int on = 1; listen_s = socket(sa->sa_family, SOCK_STREAM, 0); if (listen_s == INVALID_SOCKET) { popup_an_error("httpd socket: %s", socket_errtext()); return; } if (setsockopt(listen_s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { popup_an_error("httpd setsockopt: %s", socket_errtext()); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } if (bind(listen_s, sa, sa_len) < 0) { popup_an_error("httpd bind: %s", socket_errtext()); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } if (listen(listen_s, 10) < 0) { popup_an_error("httpd listen: %s", socket_errtext()); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } #if defined(_WIN32) /*[*/ listen_event = CreateEvent(NULL, FALSE, FALSE, NULL); if (listen_event == NULL) { popup_an_error("httpd: cannot create listen handle"); SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; return; } if (WSAEventSelect(listen_s, listen_event, FD_ACCEPT) != 0) { popup_an_error("httpd: WSAEventSelect failed: %s", socket_errtext()); CloseHandle(listen_event); listen_event = INVALID_HANDLE_VALUE; SOCK_CLOSE(listen_s); listen_s = INVALID_SOCKET; } (void) AddInput(listen_event, hio_connection); #else /*][*/ (void) AddInput(listen_s, hio_connection); #endif /*]*/ }
void NetSocketPosix::close() { if (_sock != SOCK_EMPTY) SOCK_CLOSE(_sock); _sock = SOCK_EMPTY; _ip_type = IP::TYPE_NONE; _is_stream = false; }
static int NetDisconnect(void *context) { SocketContext *sock = (SocketContext*)context; if (sock) { if (sock->fd != SOCKET_INVALID) { SOCK_CLOSE(sock->fd); sock->fd = -1; } sock->stat = SOCK_BEGIN; sock->bytes = 0; } return 0; }
/** * Close the session associated with a particular socket. * Called from the HTTPD logic when a fatal error or EOF occurs. * * @param[in] session Session */ static void hio_socket_close(session_t *session) { SOCK_CLOSE(session->s); if (session->ioid != NULL_IOID) { RemoveInput(session->ioid); } if (session->toid != NULL_IOID) { RemoveTimeOut(session->toid); } #if defined(_WIN32) /*[*/ CloseHandle(session->event); #endif /*]*/ vb_free(&session->pending.result); llist_unlink(&session->link); Free(session); n_sessions--; }
/*********************************************************************************************************************** Function: TaskAdd Description: Called By: Input: Output: Return: Others: ************************************************************************************************************************/ S32 CNetServer::TaskAdd(Socket_t sHandle) { if (!SOCK_HANDLE_OK(sHandle)) { DEBUG_INFO("sHandle err\n"); return MW_FAILED; } if (!THREAD_HANDLE_OK(m_QTaskTHandle)) { m_QTaskTHandle = ::CreateNormalThread(QTaskProc, this, 512 * 1024); } if (THREAD_HANDLE_OK(m_QTaskTHandle)) { QTaskPush(sHandle); } else { SOCK_CLOSE(sHandle); } return MW_SUCC; }
/** * New inbound connection for httpd. * * @param[in] fd socket file descriptor * @param[in] id I/O ID */ void hio_connection(iosrc_t fd, ioid_t id) { socket_t t; union { struct sockaddr sa; struct sockaddr_in sin; #if defined(X3270_IPV6) /*[*/ struct sockaddr_in6 sin6; #endif /*]*/ } sa; socklen_t len; char hostbuf[128]; session_t *session; len = sizeof(sa); t = accept(listen_s, &sa.sa, &len); if (t == INVALID_SOCKET) { vtrace("httpd accept error: %s%s\n", socket_errtext(), (socket_errno() == SE_EWOULDBLOCK)? " (harmless)": ""); return; } if (n_sessions >= N_SESSIONS) { vtrace("Too many connections.\n"); SOCK_CLOSE(t); return; } session = Malloc(sizeof(session_t)); memset(session, 0, sizeof(session_t)); vb_init(&session->pending.result); session->s = t; #if defined(_WIN32) /*[*/ session->event = CreateEvent(NULL, FALSE, FALSE, NULL); if (session->event == NULL) { vtrace("httpd: can't create socket handle\n"); SOCK_CLOSE(t); Free(session); return; } if (WSAEventSelect(session->s, session->event, FD_READ | FD_CLOSE) != 0) { vtrace("httpd: Can't set socket handle events\n"); CloseHandle(session->event); SOCK_CLOSE(t); Free(session); return; } #endif /*]*/ if (sa.sa.sa_family == AF_INET) { session->dhandle = httpd_new(session, lazyaf("%s:%u", inet_ntop(AF_INET, &sa.sin.sin_addr, hostbuf, sizeof(hostbuf)), ntohs(sa.sin.sin_port))); } #if defined(X3270_IPV6) /*[*/ else if (sa.sa.sa_family == AF_INET6) { session->dhandle = httpd_new(session, lazyaf("%s:%u", inet_ntop(AF_INET6, &sa.sin6.sin6_addr, hostbuf, sizeof(hostbuf)), ntohs(sa.sin6.sin6_port))); } #endif /*]*/ else { session->dhandle = httpd_new(session, "???"); } #if !defined(_WIN32) /*[*/ session->ioid = AddInput(t, hio_socket_input); #else /*][*/ session->ioid = AddInput(session->event, hio_socket_input); #endif /*]*/ /* Set the timeout for the first line of input. */ session->toid = AddTimeOut(IDLE_MAX * 1000, hio_timeout); llist_insert_before(&session->link, sessions.next); n_sessions++; }
void CSocket::CloseFd() { SOCK_CLOSE(m_streamFd); m_streamFd = INVALID_SOCKET; }