Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
extern void sockDelete(sock * pSock)
{
  free(pSock->m_pReceiveBuffer);
  sockClose(pSock);
}