예제 #1
0
파일: inet.c 프로젝트: akaminnya/openpernet
struct hostent* our_gethostbyname(char *name)
//     char* name;
{
	if (!initializeWinsockIfNecessary()) return NULL;

	return (struct hostent*) gethostbyname(name);
}
BasicUsageEnvironment::BasicUsageEnvironment(TaskScheduler& taskScheduler)
: BasicUsageEnvironment0(taskScheduler) {
#if defined(__WIN32__) || defined(_WIN32)
  if (!initializeWinsockIfNecessary()) {
    setResultErrMsg("Failed to initialize 'winsock': ");
    reportBackgroundError();
    internalError();
  }
#endif
}
예제 #3
0
int setupDatagramSocket(UsageEnvironment& env, Port port) {
  if (!initializeWinsockIfNecessary()) {
	  socketErr(env, "Failed to initialize 'winsock': ");
	  return -1;
	}

  int newSocket = socket(AF_INET, SOCK_DGRAM, 0);
//  printf("setupDatagramSocket: newSocket %d\n", newSocket);	//jay
  if (newSocket < 0) {
	  socketErr(env, "unable to create datagram socket: ");
	  return newSocket;
	}

  if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR,
		 (const char*)&reuseFlag, sizeof reuseFlag) < 0) {
	  socketErr(env, "setsockopt(SO_REUSEADDR) error: ");
	  closeSocket(newSocket);
	  return -1;
	}

#if defined(__WIN32__) || defined(_WIN32)
	// Windoze doesn't properly handle SO_REUSEPORT or IP_MULTICAST_LOOP
#else
#ifdef SO_REUSEPORT
  if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEPORT,
		 (const char*)&reuseFlag, sizeof reuseFlag) < 0) {
	  socketErr(env, "setsockopt(SO_REUSEPORT) error: ");
	  closeSocket(newSocket);
	  return -1;
	}
#endif

#ifdef IP_MULTICAST_LOOP
  const u_int8_t loop = 1;
  if (setsockopt(newSocket, IPPROTO_IP, IP_MULTICAST_LOOP,
		 (const char*)&loop, sizeof loop) < 0) {
	  socketErr(env, "setsockopt(IP_MULTICAST_LOOP) error: ");
	  closeSocket(newSocket);
	  return -1;
	}
#endif
#endif

	// Note: Windoze requires binding, even if the port number is 0
  netAddressBits addr = INADDR_ANY;
#if defined(__WIN32__) || defined(_WIN32)
#else
  if (port.num() != 0 || ReceivingInterfaceAddr != INADDR_ANY) {
#endif
	  if (port.num() == 0) addr = ReceivingInterfaceAddr;
	  MAKE_SOCKADDR_IN(name, addr, port.num());
	  if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) {
		  char tmpBuffer[100];
		  sprintf(tmpBuffer, "bind() error (port number: %d): ",
			  ntohs(port.num()));
		  socketErr(env, tmpBuffer);
		  closeSocket(newSocket);
		  return -1;
		}
//	printf("setupDatagramSocket: bind %s:%d\n", inet_ntoa(name.sin_addr), ntohs(name.sin_port));		//jay
#if defined(__WIN32__) || defined(_WIN32)
#else
	}
#endif

	// Set the sending interface for multicasts, if it's not the default:
  if (SendingInterfaceAddr != INADDR_ANY) {
	  struct in_addr addr;
	  addr.s_addr = SendingInterfaceAddr;

	  if (setsockopt(newSocket, IPPROTO_IP, IP_MULTICAST_IF,
			 (const char*)&addr, sizeof addr) < 0) {
		  socketErr(env, "error setting outgoing multicast interface: ");
		  closeSocket(newSocket);
		  return -1;
		}
	}

  return newSocket;
}
예제 #4
0
int setupStreamSocket(UsageEnvironment& env,
										  Port port, Boolean makeNonBlocking) {
  if (!initializeWinsockIfNecessary()) {
	  socketErr(env, "Failed to initialize 'winsock': ");
	  return -1;
	}

  int newSocket = socket(AF_INET, SOCK_STREAM, 0);
  if (newSocket < 0) {
	  socketErr(env, "unable to create stream socket: ");
	  return newSocket;
	}

  if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR,
		 (const char*)&reuseFlag, sizeof reuseFlag) < 0) {
	  socketErr(env, "setsockopt(SO_REUSEADDR) error: ");
	  closeSocket(newSocket);
	  return -1;
	}

	// SO_REUSEPORT doesn't really make sense for TCP sockets, so we
	// normally don't set them.  However, if you really want to do this
	// #define REUSE_FOR_TCP
#ifdef REUSE_FOR_TCP
#if defined(__WIN32__) || defined(_WIN32)
	// Windoze doesn't properly handle SO_REUSEPORT
#else
#ifdef SO_REUSEPORT
  if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEPORT,
		 (const char*)&reuseFlag, sizeof reuseFlag) < 0) {
	  socketErr(env, "setsockopt(SO_REUSEPORT) error: ");
	  closeSocket(newSocket);
	  return -1;
	}
#endif
#endif
#endif

	// Note: Windoze requires binding, even if the port number is 0
#if defined(__WIN32__) || defined(_WIN32)
#else
  if (port.num() != 0 || ReceivingInterfaceAddr != INADDR_ANY) {
#endif
	  MAKE_SOCKADDR_IN(name, ReceivingInterfaceAddr, port.num());
	  if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) {
		  char tmpBuffer[100];
		  sprintf(tmpBuffer, "bind() error (port number: %d): ",
			  ntohs(port.num()));
		  socketErr(env, tmpBuffer);
		  closeSocket(newSocket);
		  return -1;
		}
#if defined(__WIN32__) || defined(_WIN32)
#else
	}
#endif

  if (makeNonBlocking) {
	  if (!makeSocketNonBlocking(newSocket)) {
		  socketErr(env, "failed to make non-blocking: ");
		  closeSocket(newSocket);
		  return -1;
		}
	}

  return newSocket;
}