extern bool sockConnect(sock * pSock, uint32_t IP_HostByteOrder, int Port) { if (pSock->m_Closed) return false; if (!pSock->m_ConnectPrimed) { struct sockaddr_in server; server.sin_addr.s_addr = htonl(IP_HostByteOrder); server.sin_family = AF_INET; server.sin_port = htons((uint16_t) Port); connect(pSock->m_Socket, (struct sockaddr *) &server, sizeof(server)); pSock->m_ConnectPrimed = true; } fd_set fd_out; struct timeval tv; FD_ZERO( &fd_out ); FD_SET( pSock->m_Socket, &fd_out ); const int largest_sock = pSock->m_Socket; tv.tv_sec = 0; tv.tv_usec = 0; select(largest_sock+1, NULL, &fd_out, NULL, &tv); const int Writable = FD_ISSET(pSock->m_Socket, &fd_out); int Code; socklen_t SizeofCode = sizeof(Code); getsockopt(pSock->m_Socket, SOL_SOCKET, SO_ERROR, (char *) &Code, &SizeofCode); if (Writable && Code == 0) { pSock->m_ConnectPrimed = false; return true; } if (Code == sockECONNREFUSED) { sockClose(pSock); } return false; }
int main(int argc, char * argv[]) { SOCKET sock, clientSock; struct sockaddr_in addr; struct sockaddr clientAddr; char buffer[BUFFER_SIZE]; int clientAddrSize = 0, readBytes = 0; WoopsaServer server; WoopsaBufferSize responseLength; memset(buffer, 0, sizeof(buffer)); WoopsaServerInit(&server, "/woopsa/", woopsaEntries, ServeHTML); printf("Woopsa C library v0.1 demo server.\n"); if (sockInit() != 0) { printf("Error initializing sockets\n"); EXIT_ERROR(); } sock = socket(AF_INET, SOCK_STREAM, 0); if (!CHECK_SOCKET(sock)) { printf("Error creating socket\n"); EXIT_ERROR(); } addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(WOOPSA_PORT); if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) { printf("Error binding socket\n"); EXIT_ERROR(); } listen(sock, 5); printf("Server listening on port %d\n", WOOPSA_PORT); while (1) { clientAddrSize = sizeof(struct sockaddr_in); clientSock = accept(sock, &clientAddr, &clientAddrSize); if (!CHECK_SOCKET(clientSock)) { printf("Received an invalid client socket.\n"); EXIT_ERROR(); } while (1) { readBytes = recv(clientSock, buffer + readBytes, sizeof(buffer), 0); if (readBytes == SOCKET_ERROR) { printf("Error %d", WSAGetLastError()); break; } if (readBytes == 0) { printf("Finished\n"); break; } if (WoopsaCheckRequestComplete(&server, buffer, sizeof(buffer)) != WOOPSA_REQUEST_COMLETE) { // If the request is not complete, it means more data needs // to be -added- to the buffer continue; } if (WoopsaHandleRequest(&server, buffer, sizeof(buffer), buffer, sizeof(buffer), &responseLength) >= WOOPSA_SUCCESS) { send(clientSock, buffer, responseLength, 0); } readBytes = 0; memset(buffer, 0, sizeof(buffer)); } } if (sockClose(sock) != 0) { printf("Error closing socket\n"); EXIT_ERROR(); } if (sockQuit() != 0) { printf("Error quitting sockets\n"); EXIT_ERROR(); } getchar(); return 0; }
extern void sockDelete(sock * pSock) { free(pSock->m_pReceiveBuffer); sockClose(pSock); }