Beispiel #1
0
int main(int n, char *a[])
{
	SocketTCP myTCP;
	int port = 10000;
	if ( n > 1) port = atoi(a[1]);
	printf("Video server start on port: %d\n", port);
	if(!myTCP.OpenServer(port)) {
		fprintf(stderr, "Open server fail\n");
		return -2;
	}
	while(1) {
		pthread_t myTread;
       		struct sockaddr_in addr;
       		myArgs ma;
	try {
		ma.tcp = myTCP.Accept(&addr);
                ma.ip = inet_ntoa(addr.sin_addr);
                printf("New Client Addr %u %s Port %d  Family %d\n", *(UINT*)(&addr.sin_addr), ma.ip, addr.sin_port, addr.sin_family);
		pthread_create( &myTread, NULL, startClient, (void*)&ma);
		printf("Start...\n");
	}
	catch(...) {
		fprintf(stderr,"exception!!\n");
		return -1;
	}
	}
	return 0;
}
void protocoloAceptar(int puerto, socket_t &socket_remoto, SocketTCP& server) {
	server_logger::aceptada(puerto);
	mensaje_t akw;
	stringstream buffer;
	client_logger::aceptada(puerto, buffer);
	akw.cabecera = htonl(buffer.str().length());
	uint32_t bytes_enviar = ntohl(akw.cabecera);
	akw.mensaje = buffer.str().c_str();
	server.enviar(socket_remoto, (void*)&akw.cabecera, sizeof(akw.cabecera));
	server.enviar(socket_remoto, (void*)akw.mensaje, bytes_enviar);
}
Beispiel #3
0
SocketTCP SocketTCP::accept()
{
    SocketTCP r;
    sockaddr_in addr;
    socklen_t addrlen = sizeof(addr);
    r.sock = ::accept(this->sock, (sockaddr*)&addr, &addrlen);

    // Save Peer address
    if (r.isOpen())
        r.peerAddr = SocketAddr(ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port));

    return r;
}
Beispiel #4
0
void tellService()
{
#ifndef USINGINTERNAL
	system("sdmsg Banner");
#else
        SocketTCP tcp;
        if (tcp.Open(WIJET2_PORT, htonl(INADDR_LOOPBACK)) != 0) {
                if(tcp.Send("Banner", 6) < 1)
                         fprintf(stderr, "Send fails\n");
                tcp.Close();
        }
        else  fprintf(stderr, "error to open socket???\n");
#endif
}
Beispiel #5
0
int getIP()
{
        SocketTCP myTCP;
        char buf[40];
        unsigned int n = 0;
        myTCP.Open(WIJET2_PORT, htonl(INADDR_LOOPBACK));
        strcpy(buf, "AskIP");
        if (myTCP.Send(buf, strlen(buf) +1) > 0) {
                if (myTCP.Recv(buf, 40) > 0) {
                        sscanf(buf, "%u", &n);
                }
        }
	return n;
}
int protocoloRespuesta(SocketTCP &cliente) {
	mensaje_t akw;
	cliente.recibir((void*)&akw.cabecera, sizeof(akw.cabecera));
	akw.cabecera = ntohl(akw.cabecera);
	akw.mensaje = new char[akw.cabecera];
	cliente.recibir((void*)akw.mensaje, akw.cabecera);
	for (unsigned int i = 0; i < akw.cabecera; i++) {
		std::cout<<akw.mensaje[i];
	}
	delete[] akw.mensaje;
	if (cliente.fallo()) {
		return ERROR_PROTOCOLO;
	} else {
		return 0;
	}
}
Beispiel #7
0
void* startClient(void *ma)
{
        int rtn;
        char buffer[125], cmd[250];
        SocketTCP *myClient = ((myArgs*)ma)->tcp;
        char *IP = ((myArgs*)ma)->ip;
        myClient->SetRcvTime(5000);
        rtn = myClient->Recv(buffer, 250);
        if (rtn > 0) {
                buffer[rtn] = 0;
		if (strstr(buffer,":"))		// full mrl
			sprintf(cmd, "%s %s\n", myXine, buffer);
		else
                	sprintf(cmd, "%s tcp://%s:%s\n", myXine, IP, buffer);
                fprintf(stderr, cmd);
                system(cmd);
        } 
        delete myClient;
        printf("Done \n");
        pthread_exit(0);
} 
Beispiel #8
0
int main(int argc, char* argv[]) {
	ServerSocketTCP* serverSocket = new ServerSocketTCP(12345);
	serverSocket->bindPort();
	serverSocket->startListen();
	SocketTCP* s = serverSocket->acceptConnection();

	for (int i = 0; i < 255; i++) {
		DataPayload* data = s->receiveData();
		cout << "Data Received from ["
				<< s->getIPAddress() << ":" << s->getPortNumber()
				<< "]: " << data->getDataAsString() << endl;
		delete data;

		string message = "\"Message to client ";
		message += cpputil::Functions::numberToString(i);
		message += ".\"";
		data = new DataPayload(message);

		s->sendData(data);
		delete data;
	}

	s->closeConnection();
	delete s;
	serverSocket->releasePort();
	delete serverSocket;

	return 0;
}
////////////////////////////////////////////////////////////
/// Wait for a connection (must be listening to a port).
/// This function will block if the socket is blocking
////////////////////////////////////////////////////////////
Socket::Status SocketTCP::Accept(SocketTCP& Connected, IPAddress* Address)
{
    // Address that will be filled with client informations
    sockaddr_in ClientAddress;
    SocketHelper::LengthType Length = sizeof(ClientAddress);

    // Accept a new connection
    Connected = accept(mySocket, reinterpret_cast<sockaddr*>(&ClientAddress), &Length);

    // Check errors
    if (!Connected.IsValid())
    {
        if (Address)
            *Address = IPAddress();

        return SocketHelper::GetErrorStatus();
    }

    // Fill address if requested
    if (Address)
        *Address = IPAddress(inet_ntoa(ClientAddress.sin_addr));

    return Socket::Done;
}
bool HttpRequesterReaderServer::run(SocketTCP& requester_socket)
{
	bool is_end_request = false;
	char c;
	string request;
	string attribute_header_request;
	vector<string> header_request;
	
	while(!is_end_request) {
		requester_socket.receive(&c);
		if(c == '\r') {
			header_request.push_back(attribute_header_request);
			requester_socket.receive(&c);
			if(c == '\r') {
				is_end_request = true;
			} else if(c == '\n') {
				requester_socket.receive(&c);
				if(c == '\r') {
					requester_socket.receive(&c);
					if(c == '\n') {
						is_end_request = true;
					} else {
						return false;
					}
				} else {
					attribute_header_request = c;
				}
			} else {
				attribute_header_request = c;
			}
		} else if(c == '\n') {
			header_request.push_back(attribute_header_request);			
			if(c == '\n') {
				is_end_request = true;
			} else {
				attribute_header_request = c;
			}
		} else {
			attribute_header_request += c;
		}
	}

	if(header_request.size() > 0) {
		string cmd;
		string protocol;
		stringstream ss;

		ss << header_request[0];
		ss >> cmd;
		ss >> request;
		ss >> protocol;

		if(!ss.fail()) {
			if(cmd != "GET" || request.size() == 0 || request[0] != '/' || protocol != "HTTP/1.1") {
				return false;
			}
			request.erase(request.begin());
		} else {
			return false;
		}
	} else {
Beispiel #11
0
	void Http::proc(void* /*param*/)
	{
		bStop = false;

		if (!Paths::Exists(Paths::ExtractFilePath(filename)))
			Paths::MakeDir(Paths::ExtractFilePath(filename));

		SocketTCP   sock;
		char		buffer[4096];
		String      realFilename = filename;
		String      tmpFile = String(filename) << ".part";
		Stream		f(tmpFile, Yuni::Core::IO::OpenMode::write);
		int         count;
		int         crfound = 0;
		int         lffound = 0;

		if (!f.opened())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpGetFile: Could not open file " << tmpFile << " for writing !");
			return;        // Error can't open file
		}

		/* open the socket and connect to the server */
		sock.open(servername, 80);
		if(!sock.isOpen())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpGetFile: Could not open socket !");
			f.close();
			remove(tmpFile.c_str());
			return;
		}

		sock.setNonBlockingMode(true);      // We want it to be able to detect end of file ;)

		String tmpBuf;
		tmpBuf << "GET " << _request << " HTTP/1.0\r\nHost:" << servername << "\nAccept: */*\r\nUser-Agent: TA3D\r\nConnection: close\r\n\r\n";

		uint32 timer(msec_timer);
		sock.send(tmpBuf.data(), tmpBuf.size());
		if (!sock.isOpen())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpGetFile: Could not send request to server !");
			f.close();
			remove(tmpFile.c_str());
			return;
		}

		pos = 0;
		size = 0;
		String header;

		while (!bStop)
		{
			timer = msec_timer;
			do
			{
				count = sock.recv(buffer, sizeof(buffer) - 1);
				if (count == 0)
				{
					if (suspend(1))
					{
						sock.close();
						f.close();
						remove(tmpFile.c_str());
						return;
					}
				}
			}
			while(count == 0 && msec_timer - timer < 60000 && !bStop);
			if (msec_timer - timer >= 60000 || bStop)
				sock.close();
			if(count < 0)
			{
				sock.close();
				f.close();
				if (pos == size)
				{
					Paths::Files::Copy(tmpFile, realFilename, true);
					LOG_DEBUG(LOG_PREFIX_NET << "File successfully downloaded : " << realFilename);
				}
				else
				{	LOG_DEBUG(LOG_PREFIX_NET << "Download failed : " << realFilename);	}
				remove(tmpFile.c_str());
				return;
			}
			if(count > 0)
			{
				/* parse out the HTTP header */
				if(lffound < 2)
				{
					int i;

					for (i = 0; i < count; ++i)
					{
						header << buffer[i];
						if(buffer[i] == 0x0D)
							++crfound;
						else
						{
							if (buffer[i] == 0x0A)
								++lffound;
							else
								/* reset the CR and LF counters back to 0 */
								crfound = lffound = 0;
						}
						if (lffound == 2)
						{
							/* i points to the second LF */
							/* output the buffer to the file */
							f.write( (char*)(buffer+i+1), count-i-1 );
							pos += count-i-1;
							size = Math::Max(size, pos);
							break;
						}
					}
					if (lffound >= 2)
					{
						header.toLower();
						String::Size offset = header.find("content-length: ");
						if (offset != String::npos)
						{
							header.erase(0, offset + 16);
							header.trimRight(" \n\t");
							size = header.to<int>();
							LOG_DEBUG("header = " << header);
							LOG_DEBUG("Http: size = " << size);
						}
					}
				}
				else
				{
					f.write( (const char*)buffer, count );
					pos += count;
					size = Math::Max(size, pos);
				}
			}
		}
		sock.close();
		f.close();
		remove(tmpFile.c_str());
		LOG_ERROR(LOG_PREFIX_NET << "Http: Download interrupted!");
	}
Beispiel #12
0
	bool Http::getFile( const String &filename, const String &servername, const String &_request )
	{
		SocketTCP   sock;
		char        buffer[4096];
		Stream		f(filename, Yuni::Core::IO::OpenMode::write);
		int         count;
		int         crfound = 0;
		int         lffound = 0;

		if (!f.opened())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpGetFile: Could not open file " << filename << " for writing !");
			return true;        // Error can't open file
		}

		/* open the socket and connect to the server */
		sock.open(servername, 80);
		if(!sock.isOpen())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpGetFile: Could not open socket !");
			f.close();
			return true;
		}

		sock.setNonBlockingMode(true);      // We want it to be able to detect end of file ;)

		String tmpBuf;
		tmpBuf << "GET " << _request << " HTTP/1.0\r\nHost:" << servername << "\nAccept: */*\r\nUser-Agent: TA3D\r\nConnection: close\r\n\r\n";

		uint32 timer(msec_timer);
		sock.send(tmpBuf.data(), tmpBuf.size());
		if (!sock.isOpen())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpGetFile: Could not send request to server !");
			f.close();
			return true;
		}

		while (true)
		{
			timer = msec_timer;
			do
			{
				count = sock.recv(buffer, sizeof(buffer) - 1);
				rest(1);
			}
			while(count == 0 && msec_timer - timer < 1000);
			if (msec_timer - timer >= 1000)
				sock.close();
			if(count < 0)
			{
				sock.close();
				f.close();
				return false;
			}
			if(count > 0)
			{
				/* parse out the HTTP header */
				if(lffound < 2)
				{
					int i;

					for (i = 0; i < count; ++i)
					{
						if(buffer[i] == 0x0D)
							++crfound;
						else
						{
							if (buffer[i] == 0x0A)
								++lffound;
							else
								/* reset the CR and LF counters back to 0 */
								crfound = lffound = 0;
						}
						if (lffound == 2)
						{
							/* i points to the second LF */
							/* output the buffer to the file */
							f.write( (const char*)(buffer+i+1), count-i-1 );
							break;
						}
					}
				}
				else
					f.write( (const char*)buffer, count );
			}
		}
		sock.close();
		f.close();
		return true;
	}
Beispiel #13
0
	String Http::request( const String &servername, const String &_request )
	{
		SocketTCP   sock;
		char        buffer[4096];
		String      f;
		int         count;
		int         crfound = 0;
		int         lffound = 0;

		/* open the socket and connect to the server */
		sock.open(servername, 80);
		if(!sock.isOpen())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpRequest: Could not open socket !");
			return nullptr;
		}

		sock.setNonBlockingMode(true);      // We want to be able to detect end of transmission :p

		f.clear();

		String tmpBuf;
		tmpBuf << "GET " << _request << " HTTP/1.0\r\nHost:" << servername << "\nAccept: */*\r\nUser-Agent: TA3D\r\n\r\n";

		uint32 timer(msec_timer);
		sock.send( tmpBuf.data(), tmpBuf.size());
		if (!sock.isOpen())
		{
			LOG_ERROR(LOG_PREFIX_NET << "httpRequest: Could not send request to server !");
			return nullptr;
		}

		while (true)
		{
			timer = msec_timer;
			do
			{
				count = sock.recv(buffer, sizeof(buffer) - 1);
				rest(1);
			}
			while(count == 0 && msec_timer - timer < 1000);
			if (msec_timer - timer >= 1000)
				sock.close();
			if(count < 0)
			{
				sock.close();
				return f;
			}
			if(count > 0)
			{
				/* parse out the HTTP header */
				if(lffound < 2)
				{
					int i;

					for (i = 0; i < count; ++i)
					{
						if(buffer[i] == 0x0D)
							++crfound;
						else
						{
							if (buffer[i] == 0x0A)
								++lffound;
							else
								/* reset the CR and LF counters back to 0 */
								crfound = lffound = 0;
						}
						if (lffound == 2)
						{
							/* i points to the second LF */
							/* NUL terminate the string and put it in the buffer string */
							buffer[count] = 0x0;
							f += buffer+i+1;
							break;
						}
					}
				}
				else
				{
					buffer[count] = 0x0;
					f += buffer;
				}
			}
		}
		sock.close();
		return f;
	}