/*------------------------------------------------------------------------------------------------------------------ -- FUNCTION: socket_event -- -- DATE: Febuary 6 2014 -- REVISIONS: none -- -- DESIGNER: Ramzi Chennafi -- PROGRAMMER: Ramzi Chennafi -- -- INTERFACE: void socket_event(HWND hwnd, WPARAM wParam, LPARAM lParam), where wParam is the socket and lParam is the error message. -- The hwnd is the parent HWND. -- -- RETURNS: void -- -- NOTES: -- Asynchronously responds to socket accept and read events on the server side of the program. Will reallocate the -- SocketInfo structure whenever a transfer ends. ----------------------------------------------------------------------------------------------------------------------*/ void socket_event(HWND hwnd, WPARAM wParam, LPARAM lParam){ SETTINGS * st = (SETTINGS*)GetClassLongPtr(hwnd, 0); char msg[MAX_SIZE]; if (WSAGETSELECTERROR(lParam)) { sprintf_s(msg, "WSAGETSELECTERROR %d, connection failed.\n", WSAGETSELECTERROR(lParam)); activity(msg, EB_STATUSBOX); closesocket(st->server_socket); } else { switch (WSAGETSELECTEVENT(lParam)) { case FD_ACCEPT: accept_data(hwnd, wParam); break; case FD_READ: if (st->protocol == TCP){ if (read_tcp(hwnd, st->server_socket) >= 1){ if ((SocketInfo = (LPSOCKET_INFORMATION)GlobalAlloc(GPTR, sizeof(SOCKET_INFORMATION))) == NULL){ activity("GlobalAlloc() failed with error\n", EB_STATUSBOX); } SocketInfo->header_received = 0; // transmission ends, program waits for a new header } } else{ if (read_udp(hwnd, st->server_socket) >= 1){ if ((SocketInfo = (LPSOCKET_INFORMATION)GlobalAlloc(GPTR, sizeof(SOCKET_INFORMATION))) == NULL){ activity("GlobalAlloc() failed with error\n", EB_STATUSBOX); } SocketInfo->header_received = 0; } } } } }
static void process_select(fd_set *rfds, fd_set *wfds, fd_set *efds) { unsigned int i = 0; while (i < num_flows) { struct _flow *flow = &flows[i]; DEBUG_MSG(LOG_DEBUG, "processing pselect() for flow %d", flow->id); if (flow->listenfd_data != -1 && FD_ISSET(flow->listenfd_data, rfds)) { DEBUG_MSG(LOG_DEBUG, "ready for accept"); if (flow->state == GRIND_WAIT_ACCEPT) { if (accept_data(flow) == -1) { DEBUG_MSG(LOG_ERR, "accept_data() " "failed"); goto remove; } } } if (flow->fd != -1) { if (FD_ISSET(flow->fd, efds)) { int error_number, rc; socklen_t error_number_size = sizeof(error_number); DEBUG_MSG(LOG_DEBUG, "sock of flow %d in efds", flow->id); rc = getsockopt(flow->fd, SOL_SOCKET, SO_ERROR, (void *)&error_number, &error_number_size); if (rc == -1) { warn("failed to get errno for" "non-blocking connect"); goto remove; } if (error_number != 0) { warnc(error_number, "connect"); goto remove; } } if (FD_ISSET(flow->fd, wfds)) if (write_data(flow) == -1) { DEBUG_MSG(LOG_ERR, "write_data() failed"); goto remove; } if (FD_ISSET(flow->fd, rfds)) if (read_data(flow) == -1) { DEBUG_MSG(LOG_ERR, "read_data() failed"); goto remove; } } i++; continue; remove: if (flow->fd != -1) { flow->statistics[FINAL].has_tcp_info = get_tcp_info(flow, &flow->statistics[FINAL].tcp_info) ? 0 : 1; } flow->pmtu = get_pmtu(flow->fd); report_flow(flow, FINAL); uninit_flow(flow); remove_flow(i); DEBUG_MSG(LOG_ERR, "removed flow %d", flow->id); } }