Clarified: get string from URL
- manal
- Born


- Joined: Oct 15, 2003
- Posts: 1
- Status: Offline
I need a C++ function that takes a URL as argument , and returns a string of the first 6 characters of THE WEBPAGE this URL directs to...
(ie if i apply this to http://www.ozzu.com, i should get back something like the first 6 characters of "OZZU WEBMASTER FORUM" ...the URL i'm using is however a lot less esthetically programmed)
Please help!
thanks!
manal
(ie if i apply this to http://www.ozzu.com, i should get back something like the first 6 characters of "OZZU WEBMASTER FORUM" ...the URL i'm using is however a lot less esthetically programmed)
Please help!
thanks!
manal
- Anonymous
- Bot


- Joined: 25 Feb 2008
- Posts: ?
- Loc: Ozzuland
- Status: Online
October 16th, 2003, 11:20 pm
- b_heyer
- Web Master


- Joined: Jun 15, 2003
- Posts: 4583
- Loc: Maryland
- Status: Offline
- dr nick
- Proficient


- Joined: Sep 10, 2003
- Posts: 263
- Loc: Frankfurt
- Status: Offline
Code: [ Select ]
void first6(unsigned char *six, unsigned char *url) {
int i;
int offset;
/* with your offset, you can determine as of when you should copy 6 characters */
offset = 0; // if you know your url starts with "http://", you could set this value to 7
for (i = 0; i < 6; i++) {
six[i] = url[i+offset];
}
}
int i;
int offset;
/* with your offset, you can determine as of when you should copy 6 characters */
offset = 0; // if you know your url starts with "http://", you could set this value to 7
for (i = 0; i < 6; i++) {
six[i] = url[i+offset];
}
}
- void first6(unsigned char *six, unsigned char *url) {
- int i;
- int offset;
- /* with your offset, you can determine as of when you should copy 6 characters */
- offset = 0; // if you know your url starts with "http://", you could set this value to 7
- for (i = 0; i < 6; i++) {
- six[i] = url[i+offset];
- }
- }
OK, this isn't great code, but so far from what you've asked it should provide a starting base. You'll probably want to refine it to test whether the url starts with http or something. Also, note that I didn't test whether the url is actually 6 characters long, so you will also want to test for that.
- dr nick
- Proficient


- Joined: Sep 10, 2003
- Posts: 263
- Loc: Frankfurt
- Status: Offline
- Bigwebmaster
- Site Admin


- Joined: Dec 20, 2002
- Posts: 8926
- Loc: Seattle, WA & Phoenix, AZ
- Status: Offline
Well that would take a bit of work to create that function, since it is doing a few thing there. First it has to request the webpage URL. After that it needs to parse through the source of the page it requested to find what is in the title tag. Finally it would need to only use the first 6 characters of what is in the title tag. Anyway I am not going to write all that for you, but I can give you some parts that may help. You can probably use some of what Dr Nick gave you with this. Here is how you can request a URL in C++ and get the output of what you request:
You will also need these classes / header files.
Here is clientsocket.h
Here is clientsocket.cpp
Code: [ Select ]
string serverReply;
//connect to server
try {
ClientSocket clientSocket("www.yourdomain.com", 80, 2);
try {
clientSocket << "GET http://www.yourdomain.com/ HTTP/1.0\n";
clientSocket << "Host: www.yourdomain.com\n\n";
clientSocket >> serverReply;
}
catch(SocketException& e) {
cout << "Exception was caught: " << e.description() << "<br>" << endl;
}
cout << "Response from server: " << serverReply << "<br><br>" << endl;
}
catch(SocketException& e) {
cout << "Exception was caught: " << e.description() << "<br>" << endl;
}
//connect to server
try {
ClientSocket clientSocket("www.yourdomain.com", 80, 2);
try {
clientSocket << "GET http://www.yourdomain.com/ HTTP/1.0\n";
clientSocket << "Host: www.yourdomain.com\n\n";
clientSocket >> serverReply;
}
catch(SocketException& e) {
cout << "Exception was caught: " << e.description() << "<br>" << endl;
}
cout << "Response from server: " << serverReply << "<br><br>" << endl;
}
catch(SocketException& e) {
cout << "Exception was caught: " << e.description() << "<br>" << endl;
}
- string serverReply;
- //connect to server
- try {
- ClientSocket clientSocket("www.yourdomain.com", 80, 2);
- try {
- clientSocket << "GET http://www.yourdomain.com/ HTTP/1.0\n";
- clientSocket << "Host: www.yourdomain.com\n\n";
- clientSocket >> serverReply;
- }
- catch(SocketException& e) {
- cout << "Exception was caught: " << e.description() << "<br>" << endl;
- }
- cout << "Response from server: " << serverReply << "<br><br>" << endl;
- }
- catch(SocketException& e) {
- cout << "Exception was caught: " << e.description() << "<br>" << endl;
- }
You will also need these classes / header files.
Here is clientsocket.h
Code: [ Select ]
#ifndef __clientsocket_h
#define __clientsocket_h // Prevent multiple #includes
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/time.h>
const int MAXHOSTNAME = 200;
const int MAXCONNECTIONS = 5;
const int MAXRECV = 50000;
class Socket {
private:
int m_sock;
sockaddr_in m_addr;
public:
Socket();
virtual ~Socket();
// Server initialization
bool create();
bool bind (const int port);
bool listen() const;
bool accept (Socket&) const;
// Client initialization
bool connect (const std::string host, const int port, const int timeOut);
// Data Transimission
bool send (const std::string) const;
int recv (std::string&) const;
void set_non_blocking (const bool);
bool is_valid() const { return m_sock != -1; }
};
class ClientSocket : private Socket {
public:
ClientSocket (std::string host, int port, int timeOut);
virtual ~ClientSocket(){};
const ClientSocket& operator << (const std::string&) const;
const ClientSocket& operator >> (std::string&) const;
};
class SocketException {
private:
std::string m_s;
public:
SocketException(std::string s) : m_s(s) {};
~SocketException(){};
std::string description() { return m_s; }
};
#endif // __clientsocket_h
#define __clientsocket_h // Prevent multiple #includes
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/time.h>
const int MAXHOSTNAME = 200;
const int MAXCONNECTIONS = 5;
const int MAXRECV = 50000;
class Socket {
private:
int m_sock;
sockaddr_in m_addr;
public:
Socket();
virtual ~Socket();
// Server initialization
bool create();
bool bind (const int port);
bool listen() const;
bool accept (Socket&) const;
// Client initialization
bool connect (const std::string host, const int port, const int timeOut);
// Data Transimission
bool send (const std::string) const;
int recv (std::string&) const;
void set_non_blocking (const bool);
bool is_valid() const { return m_sock != -1; }
};
class ClientSocket : private Socket {
public:
ClientSocket (std::string host, int port, int timeOut);
virtual ~ClientSocket(){};
const ClientSocket& operator << (const std::string&) const;
const ClientSocket& operator >> (std::string&) const;
};
class SocketException {
private:
std::string m_s;
public:
SocketException(std::string s) : m_s(s) {};
~SocketException(){};
std::string description() { return m_s; }
};
#endif // __clientsocket_h
- #ifndef __clientsocket_h
- #define __clientsocket_h // Prevent multiple #includes
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <unistd.h>
- #include <string>
- #include <arpa/inet.h>
- #include <string.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <sys/time.h>
- const int MAXHOSTNAME = 200;
- const int MAXCONNECTIONS = 5;
- const int MAXRECV = 50000;
- class Socket {
- private:
- int m_sock;
- sockaddr_in m_addr;
- public:
- Socket();
- virtual ~Socket();
- // Server initialization
- bool create();
- bool bind (const int port);
- bool listen() const;
- bool accept (Socket&) const;
- // Client initialization
- bool connect (const std::string host, const int port, const int timeOut);
- // Data Transimission
- bool send (const std::string) const;
- int recv (std::string&) const;
- void set_non_blocking (const bool);
- bool is_valid() const { return m_sock != -1; }
- };
- class ClientSocket : private Socket {
- public:
- ClientSocket (std::string host, int port, int timeOut);
- virtual ~ClientSocket(){};
- const ClientSocket& operator << (const std::string&) const;
- const ClientSocket& operator >> (std::string&) const;
- };
- class SocketException {
- private:
- std::string m_s;
- public:
- SocketException(std::string s) : m_s(s) {};
- ~SocketException(){};
- std::string description() { return m_s; }
- };
- #endif // __clientsocket_h
Here is clientsocket.cpp
Code: [ Select ]
#include "clientsocket.h"
Socket::Socket() : m_sock (-1)
{
memset (&m_addr, 0, sizeof(m_addr));
}
Socket::~Socket()
{
if (is_valid())
::close (m_sock);
}
bool Socket::create()
{
m_sock = socket(AF_INET, SOCK_STREAM, 0);
if (! is_valid())
return false;
// TIME_WAIT - argh
int on = 1;
if (setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(on)) == -1)
return false;
return true;
}
bool Socket::bind (const int port)
{
if (! is_valid())
return false;
m_addr.sin_family = AF_INET;
m_addr.sin_addr.s_addr = INADDR_ANY;
m_addr.sin_port = htons(port);
int bind_return = ::bind(m_sock, (struct sockaddr *) &m_addr, sizeof(m_addr));
if(bind_return == -1)
return false;
return true;
}
bool Socket::listen() const
{
if(! is_valid())
return false;
int listen_return = ::listen(m_sock, MAXCONNECTIONS);
if (listen_return == -1)
return false;
return true;
}
bool Socket::accept(Socket& new_socket) const
{
int addr_length = sizeof(m_addr);
new_socket.m_sock = ::accept (m_sock, (sockaddr *) &m_addr, (socklen_t *) &addr_length);
if (new_socket.m_sock <= 0)
return false;
else
return true;
}
bool Socket::send(const std::string s) const
{
int status = ::send(m_sock, s.c_str(), s.size(), 0);
if (status == -1)
return false;
else
return true;
}
int Socket::recv(std::string& s) const
{
char buf[MAXRECV + 1];
s = "";
memset(buf, 0, MAXRECV + 1);
int status = ::recv(m_sock, buf, MAXRECV, 0);
if (status == -1) {
// std::cout << "status == -1 errno == " << errno << ", " << strerror(errno) << " in Socket::recv\n";
return 0;
}
else if (status == 0)
return 0;
else {
s = buf;
return status;
}
}
bool Socket::connect(const std::string host, const int port, const int timeOut)
{
struct hostent *hp;
struct timeval tv;
fd_set writefds;
tv.tv_sec = timeOut;
tv.tv_usec = 500000;
FD_ZERO(&writefds);
FD_SET(m_sock, &writefds);
if (! is_valid()) return false;
if((hp = gethostbyname(host.c_str()))) {
memset((char *) &m_addr, 0, sizeof(m_addr));
memmove((char *) &m_addr.sin_addr, hp->h_addr, hp->h_length);
}
else return false;
m_addr.sin_family = AF_INET;
m_addr.sin_port = htons(port);
if (errno == EAFNOSUPPORT) return false;
::connect(m_sock, (sockaddr *) &m_addr, sizeof (m_addr));
select(m_sock+1, NULL, &writefds, NULL, &tv);
if (FD_ISSET(m_sock, &writefds))
return true;
else
return false;
}
void Socket::set_non_blocking(const bool b)
{
int opts;
opts = fcntl (m_sock, F_GETFL);
if (opts < 0)
return;
if (b)
opts = (opts | O_NONBLOCK);
else
opts = (opts & ~O_NONBLOCK);
fcntl (m_sock, F_SETFL,opts);
}
ClientSocket::ClientSocket(std::string host, int port, int timeOut)
{
if(! Socket::create())
throw SocketException ( "Could not create client socket." );
Socket::set_non_blocking(true);
if(! Socket::connect (host, port, timeOut))
throw SocketException ("Could not bind to port.");
Socket::set_non_blocking(false);
}
const ClientSocket& ClientSocket::operator << (const std::string& s) const
{
if (! Socket::send (s))
throw SocketException ("Could not write to socket.");
return *this;
}
const ClientSocket& ClientSocket::operator >> (std::string& s) const
{
if (! Socket::recv(s))
throw SocketException("Could not read from socket.");
return *this;
}
Socket::Socket() : m_sock (-1)
{
memset (&m_addr, 0, sizeof(m_addr));
}
Socket::~Socket()
{
if (is_valid())
::close (m_sock);
}
bool Socket::create()
{
m_sock = socket(AF_INET, SOCK_STREAM, 0);
if (! is_valid())
return false;
// TIME_WAIT - argh
int on = 1;
if (setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(on)) == -1)
return false;
return true;
}
bool Socket::bind (const int port)
{
if (! is_valid())
return false;
m_addr.sin_family = AF_INET;
m_addr.sin_addr.s_addr = INADDR_ANY;
m_addr.sin_port = htons(port);
int bind_return = ::bind(m_sock, (struct sockaddr *) &m_addr, sizeof(m_addr));
if(bind_return == -1)
return false;
return true;
}
bool Socket::listen() const
{
if(! is_valid())
return false;
int listen_return = ::listen(m_sock, MAXCONNECTIONS);
if (listen_return == -1)
return false;
return true;
}
bool Socket::accept(Socket& new_socket) const
{
int addr_length = sizeof(m_addr);
new_socket.m_sock = ::accept (m_sock, (sockaddr *) &m_addr, (socklen_t *) &addr_length);
if (new_socket.m_sock <= 0)
return false;
else
return true;
}
bool Socket::send(const std::string s) const
{
int status = ::send(m_sock, s.c_str(), s.size(), 0);
if (status == -1)
return false;
else
return true;
}
int Socket::recv(std::string& s) const
{
char buf[MAXRECV + 1];
s = "";
memset(buf, 0, MAXRECV + 1);
int status = ::recv(m_sock, buf, MAXRECV, 0);
if (status == -1) {
// std::cout << "status == -1 errno == " << errno << ", " << strerror(errno) << " in Socket::recv\n";
return 0;
}
else if (status == 0)
return 0;
else {
s = buf;
return status;
}
}
bool Socket::connect(const std::string host, const int port, const int timeOut)
{
struct hostent *hp;
struct timeval tv;
fd_set writefds;
tv.tv_sec = timeOut;
tv.tv_usec = 500000;
FD_ZERO(&writefds);
FD_SET(m_sock, &writefds);
if (! is_valid()) return false;
if((hp = gethostbyname(host.c_str()))) {
memset((char *) &m_addr, 0, sizeof(m_addr));
memmove((char *) &m_addr.sin_addr, hp->h_addr, hp->h_length);
}
else return false;
m_addr.sin_family = AF_INET;
m_addr.sin_port = htons(port);
if (errno == EAFNOSUPPORT) return false;
::connect(m_sock, (sockaddr *) &m_addr, sizeof (m_addr));
select(m_sock+1, NULL, &writefds, NULL, &tv);
if (FD_ISSET(m_sock, &writefds))
return true;
else
return false;
}
void Socket::set_non_blocking(const bool b)
{
int opts;
opts = fcntl (m_sock, F_GETFL);
if (opts < 0)
return;
if (b)
opts = (opts | O_NONBLOCK);
else
opts = (opts & ~O_NONBLOCK);
fcntl (m_sock, F_SETFL,opts);
}
ClientSocket::ClientSocket(std::string host, int port, int timeOut)
{
if(! Socket::create())
throw SocketException ( "Could not create client socket." );
Socket::set_non_blocking(true);
if(! Socket::connect (host, port, timeOut))
throw SocketException ("Could not bind to port.");
Socket::set_non_blocking(false);
}
const ClientSocket& ClientSocket::operator << (const std::string& s) const
{
if (! Socket::send (s))
throw SocketException ("Could not write to socket.");
return *this;
}
const ClientSocket& ClientSocket::operator >> (std::string& s) const
{
if (! Socket::recv(s))
throw SocketException("Could not read from socket.");
return *this;
}
- #include "clientsocket.h"
- Socket::Socket() : m_sock (-1)
- {
- memset (&m_addr, 0, sizeof(m_addr));
- }
- Socket::~Socket()
- {
- if (is_valid())
- ::close (m_sock);
- }
- bool Socket::create()
- {
- m_sock = socket(AF_INET, SOCK_STREAM, 0);
- if (! is_valid())
- return false;
- // TIME_WAIT - argh
- int on = 1;
- if (setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(on)) == -1)
- return false;
- return true;
- }
- bool Socket::bind (const int port)
- {
- if (! is_valid())
- return false;
- m_addr.sin_family = AF_INET;
- m_addr.sin_addr.s_addr = INADDR_ANY;
- m_addr.sin_port = htons(port);
- int bind_return = ::bind(m_sock, (struct sockaddr *) &m_addr, sizeof(m_addr));
- if(bind_return == -1)
- return false;
- return true;
- }
- bool Socket::listen() const
- {
- if(! is_valid())
- return false;
- int listen_return = ::listen(m_sock, MAXCONNECTIONS);
- if (listen_return == -1)
- return false;
- return true;
- }
- bool Socket::accept(Socket& new_socket) const
- {
- int addr_length = sizeof(m_addr);
- new_socket.m_sock = ::accept (m_sock, (sockaddr *) &m_addr, (socklen_t *) &addr_length);
- if (new_socket.m_sock <= 0)
- return false;
- else
- return true;
- }
- bool Socket::send(const std::string s) const
- {
- int status = ::send(m_sock, s.c_str(), s.size(), 0);
- if (status == -1)
- return false;
- else
- return true;
- }
- int Socket::recv(std::string& s) const
- {
- char buf[MAXRECV + 1];
- s = "";
- memset(buf, 0, MAXRECV + 1);
- int status = ::recv(m_sock, buf, MAXRECV, 0);
- if (status == -1) {
- // std::cout << "status == -1 errno == " << errno << ", " << strerror(errno) << " in Socket::recv\n";
- return 0;
- }
- else if (status == 0)
- return 0;
- else {
- s = buf;
- return status;
- }
- }
- bool Socket::connect(const std::string host, const int port, const int timeOut)
- {
- struct hostent *hp;
- struct timeval tv;
- fd_set writefds;
- tv.tv_sec = timeOut;
- tv.tv_usec = 500000;
- FD_ZERO(&writefds);
- FD_SET(m_sock, &writefds);
- if (! is_valid()) return false;
- if((hp = gethostbyname(host.c_str()))) {
- memset((char *) &m_addr, 0, sizeof(m_addr));
- memmove((char *) &m_addr.sin_addr, hp->h_addr, hp->h_length);
- }
- else return false;
- m_addr.sin_family = AF_INET;
- m_addr.sin_port = htons(port);
- if (errno == EAFNOSUPPORT) return false;
- ::connect(m_sock, (sockaddr *) &m_addr, sizeof (m_addr));
- select(m_sock+1, NULL, &writefds, NULL, &tv);
- if (FD_ISSET(m_sock, &writefds))
- return true;
- else
- return false;
- }
- void Socket::set_non_blocking(const bool b)
- {
- int opts;
- opts = fcntl (m_sock, F_GETFL);
- if (opts < 0)
- return;
- if (b)
- opts = (opts | O_NONBLOCK);
- else
- opts = (opts & ~O_NONBLOCK);
- fcntl (m_sock, F_SETFL,opts);
- }
- ClientSocket::ClientSocket(std::string host, int port, int timeOut)
- {
- if(! Socket::create())
- throw SocketException ( "Could not create client socket." );
- Socket::set_non_blocking(true);
- if(! Socket::connect (host, port, timeOut))
- throw SocketException ("Could not bind to port.");
- Socket::set_non_blocking(false);
- }
- const ClientSocket& ClientSocket::operator << (const std::string& s) const
- {
- if (! Socket::send (s))
- throw SocketException ("Could not write to socket.");
- return *this;
- }
- const ClientSocket& ClientSocket::operator >> (std::string& s) const
- {
- if (! Socket::recv(s))
- throw SocketException("Could not read from socket.");
- return *this;
- }
Ozzu Hosting - Want your website on a fast server like Ozzu?
Page 1 of 1
To Reply to this topic you need to LOGIN or REGISTER. It is free.
Post Information
- Total Posts in this topic: 5 posts
- Users browsing this forum: No registered users and 238 guests
- You cannot post new topics in this forum
- You cannot reply to topics in this forum
- You cannot edit your posts in this forum
- You cannot delete your posts in this forum
- You cannot post attachments in this forum
