示例#1
0
s32 tcp_socket (void) {
    s32 s, res;

    s = net_socket (PF_INET, SOCK_STREAM, 0);
    if (s < 0) {
        printf ("net_socket failed: %d\n", s);
        return s;
    }

    res = net_fcntl (s, F_GETFL, 0);
    if (res < 0) {
        printf ("F_GETFL failed: %d\n", res);
        net_close (s);
        return res;
    }

    res = net_fcntl (s, F_SETFL, res | 4);
    if (res < 0) {
        printf ("F_SETFL failed: %d\n", res);
        net_close (s);
        return res;
    }

    return s;
}
示例#2
0
static s32 tcp_socket(void)
{
	s32 s, res;

	s = net_socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
	if (s < 0)
		return s;

	// Switch off Nagle with TCP_NODELAY
	u32 nodelay = 1;
	net_setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&nodelay,sizeof(nodelay));

	res = net_fcntl(s, F_GETFL, 0);
	if (res < 0)
	{
		net_close(s);
		return res;
	}

	res = net_fcntl(s, F_SETFL, res | IOS_O_NONBLOCK);
	if (res < 0)
	{
		net_close(s);
		return res;
	}

	return s;
}
示例#3
0
s32 tcp_socket (void) {
	s32 s, res;

	s = net_socket (PF_INET, SOCK_STREAM, 0);
	if (s < 0) {
		printDebugMsg(NORMAL_DEBUG_MESSAGE,"net_socket failed: %d\n", s);
		return s;
	}

	res = net_fcntl (s, F_GETFL, 0);
	if (res < 0) {
		printDebugMsg(NORMAL_DEBUG_MESSAGE,"F_GETFL failed: %d\n", res);
		net_close (s);
		return res;
	}

	res = net_fcntl (s, F_SETFL, res | 4);
	if (res < 0) {
		printDebugMsg(NORMAL_DEBUG_MESSAGE,"F_SETFL failed: %d\n", res);
		net_close (s);
		return res;
	}

	return s;
}
示例#4
0
文件: http.cpp 项目: ifish12/WiiTweet
static s32 tcp_socket(void)
{
	s32 s, res;

	s = net_socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
	if (s < 0)
		return s;

	if(split_res == 2){
		return s;
	}

	res = net_fcntl(s, F_GETFL, 0);
	if (res < 0)
	{
		net_close(s);
		return res;
	}

	res = net_fcntl(s, F_SETFL, res | IOS_O_NONBLOCK);
	if (res < 0)
	{
		net_close(s);
		return res;
	}

	return s;
}
示例#5
0
static s32 setNonblocking(s32 fd)
{
    s32 flags;

    /* Fixme: O_NONBLOCK is defined but broken on SunOS 4.1.x and AIX 3.2.5. */
    if (-1 == (flags = net_fcntl(fd, F_GETFL, 0)))
        flags = 0;
    return net_fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}     
/****************************************************************************
 * Test if connection to the address is available (PING)
 ***************************************************************************/
bool CheckConnection(const char *url, float timeout)
{
	//Check if the url starts with "http://", if not it is not considered a valid url
	if (strncmp(url, "http://", strlen("http://")) != 0)
		return false;

	//Locate the path part of the url by searching for '/' past "http://"
	char *path = strchr(url + strlen("http://"), '/');

	//At the very least the url has to end with '/', ending with just a domain is invalid
	if (path == NULL)
		return false;

	//Extract the domain part out of the url
	int domainlength = path - url - strlen("http://");
	if (domainlength == 0)
		return false;

	char domain[domainlength + 1];
	strlcpy(domain, url + strlen("http://"), domainlength + 1);

	//Parsing of the URL is done, start making an actual connection
	u32 ipaddress = getipbynamecached(domain);
	if (ipaddress == 0)
		return false;

	//Initialize socket
	s32 connection = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	if (connection < 0) return connection;

	s32 flags = net_fcntl(connection, F_GETFL, 0);
	if (flags >= 0) flags = net_fcntl(connection, F_SETFL, flags | 4);

	struct sockaddr_in connect_addr;
	memset(&connect_addr, 0, sizeof(connect_addr));
	connect_addr.sin_family = AF_INET;
	connect_addr.sin_port = 80;
	connect_addr.sin_addr.s_addr = getipbynamecached(domain);

	Timer netTime;

	int res = -1;
	while(res < 0 && res != -127 && netTime.elapsed() < timeout)
	{
		res = net_connect(connection, (struct sockaddr*) &connect_addr, sizeof(connect_addr));
		usleep(1000);
	}

	net_close(connection);

	return !(res < 0 && res != -127);
}
示例#7
0
s32 tcp_socket (void) {
	s32 s, res;

	s = net_socket (PF_INET, SOCK_STREAM, 0);
	if (s < 0) {
		return s;
	}

	res = net_fcntl (s, F_GETFL, 0);
	if (res < 0) {
		net_close (s);
		return res;
	}

	res = net_fcntl (s, F_SETFL, res | 4);
	if (res < 0) {
		net_close (s);
		return res;
	}

	return s;
}
示例#8
0
s32 tcp_socket (void) {
	s32 s, res;

	s = net_socket (PF_INET, SOCK_STREAM, 0);
	if (s < 0) return s;

	if(http_port == 80)
	{
		res = net_fcntl (s, F_GETFL, 0);
		if (res < 0) {
			net_close (s);
			return res;
		}
		//set non-blocking
		res = net_fcntl (s, F_SETFL, res | 4);
		if (res < 0) {
			net_close (s);
			return res;
		}
	}

	return s;
}
示例#9
0
s32 set_blocking(s32 s, bool blocking) {
	s32 flags;
	flags = net_fcntl(s, F_GETFL, 0);
	if (flags >= 0) flags = net_fcntl(s, F_SETFL, blocking ? (flags&~4) : (flags|4));
	return flags;
}
示例#10
0
bool NetReceiver::CheckIncomming()
{
	struct sockaddr_in sin;
	struct sockaddr_in client_address;
	socklen_t addrlen = sizeof(client_address);

	//Open socket
	socket = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

	if (socket == INVALID_SOCKET)
	{
		return false;
	}

	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = htonl(INADDR_ANY);

	int flags = net_fcntl(socket, F_GETFL, 0);
	flags = net_fcntl(socket, F_SETFL, flags | 4);

	if (net_bind(socket, (struct sockaddr*)&sin, sizeof(sin)) < 0) {
		net_close(socket);
		return false;
	}

	if (net_listen(socket, 10) < 0) {
		net_close(socket);
		return false;
	}

	Timer CTimer;

	do
	{
		connection = net_accept(socket, (struct sockaddr*)&client_address, &addrlen);
		if(connection >= 0)
			break;
	}
	while(CTimer.elapsed() < 1.0f);

	sprintf(incommingIP, "%s", inet_ntoa(client_address.sin_addr));

	if (connection < 0)
	{
		net_close(socket);
		return false;
	}
	else
	{
		unsigned char haxx[9];
		//skip haxx
		net_read(connection, &haxx, 8);
		if (memcmp(haxx, "HAXX", 4) != 0) // unsupported protocol
		{
			net_close(connection);
			net_close(socket);
			return false;
		}
		wiiloadVersion[0] = haxx[4];
		wiiloadVersion[1] = haxx[5];

		net_read(connection, &filesize, 4);

		if (haxx[4] > 0 || haxx[5] > 4)
			net_read(connection, &uncfilesize, 4); // Compressed protocol, read another 4 bytes
	}

	return true;
}
示例#11
0
static bool StartWiiLoadServer (void)
	{
	struct sockaddr_in sin;
	struct sockaddr_in client_address;
	s32 connection;
	int err;
	
	if ( wiiload.status == WIILOAD_HBREADY || wiiload.status == WIILOAD_HBZREADY)
		{
		// This isn't an error, simply we have received valid data. Host process should set hbready mode to IDLE or stop/restart the thread
		return true;
		}

	// Clean old data, if any
	if (wiiload.args) free (wiiload.args);
	
	wiiload.args = NULL;
	wiiload.argl = 0;
	
	printopt ("StartWiiLoadServer begin");
	
	socklen_t addrlen = sizeof(client_address);

	//Open socket
	socket = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	if (socket == INVALID_SOCKET)
		{
		printopt ("net_socket INVALID_SOCKET");
		return false;
		}

	int one = 1;
	err = net_setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char *)&one, sizeof(one));
	if (err < 0)
		{
		printopt ("net_setsockopt %d");
		return false;
		}
	
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = htonl(INADDR_ANY);

	int flags = net_fcntl(socket, F_GETFL, 0);
	flags = net_fcntl(socket, F_SETFL, flags|4); // Set non blocking

	err = net_bind(socket, (struct sockaddr*)&sin, sizeof(sin));
	if (err < 0)
		{
		printopt ("net_bind error %d", err);
		net_close(socket);
		return false;
		}

	if (net_listen(socket, 10) < 0)
		{
		printopt ("net_listen error");
		net_close(socket);
		return false;
		}
	
	printopt ("net_accept");
	
	// WIILOAD_IDLE is set once. This because if an hb is executed it make no sense....
	// Maybe it can be usefull for an app is an hb is rejected. Hosting appl. can set it by itsel
	
	wiiload.status = WIILOAD_IDLE;

	do
		{
		int i;
		
		for (i = 0; i < 10; i++)
			{
			usleep (50000);
			if (pauseWiiload) break;
			}
		
		if (pauseWiiload)
			{
			Debug ("WiiLoad thread paused");
			pauseWiiload = 2;
			do
				{
				usleep (250*1000);
				}
			while (pauseWiiload && !stopNetworkThread);
			Debug ("WiiLoad thread resumed");
			pauseWiiload = 0;
			}
		
		connection = net_accept(socket, (struct sockaddr*)&client_address, &addrlen);
		if (connection >= 0)
			{
			sprintf(wiiload.op, "%s", inet_ntoa(client_address.sin_addr));
			if (!WiiLoad (connection))
				{
				wiiload.status = WIILOAD_IDLE;
				}
			net_close(connection);
			}
			
		usleep (100);
		}
	while (!stopNetworkThread);
	
	net_close(socket);
	
	return true;
	}