Witam,
chciałbym móc pobierać plik html podanej strony. Na razie mam coś takiego:
void connect(int browserSocked, string ip_addr, string page)
{
int socketDesc;
char buf[256];
struct addrinfo hints{};
hints.ai_family = PF_UNSPEC;
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo *addr;
getaddrinfo( ip_addr.data(), "80", &hints, &addr );
socketDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(socketDesc == -1)
{
cout << "Failed set socket!!!" << endl;
return;
}
if(connect(socketDesc, addr->ai_addr, sizeof( struct sockaddr_in )) < 0)
{
cout << "Failed to connect!!!" << endl;
return;
}
sprintf(buf, "GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: bsc.c\r\n\r\n", page.data(), ip_addr.data());
write(socketDesc, buf, strlen(buf));
while((recv(socketDesc, buf, sizeof(buf), 0)) > 0)
write(browserSocked, buf, sizeof(buf));
close(socketDesc);
close(browserSocked);
}
int main()
{
signal(SIGINT, signal_callback_handler);
#define SERVER_PORT 5555
#define QUEUE_SIZE 1
int nSocketDesc, nClientSocket;
int nBind, nListen;
struct sockaddr_in stAddr, stClientAddr;
socklen_t sockAddrSize;
char buffer[50];
string ip_addr = "";
int nFoo = 1;
string page = "";
stAddr.sin_family = AF_INET;
stAddr.sin_addr.s_addr = htonl(INADDR_ANY);
stAddr.sin_port = htons(SERVER_PORT);
nSocketDesc = socket(AF_INET, SOCK_STREAM, 0);
if(nSocketDesc < 0)
{
cout << "Can't create a socket!!!" << endl;
exit(1);
}
setsockopt(nSocketDesc, SOL_SOCKET, SO_REUSEADDR, (char*) &nFoo, sizeof(nFoo));
nBind = bind(nSocketDesc, (struct sockaddr*) &stAddr, sizeof(struct sockaddr));
if(nBind < 0)
{
cout << "Can't bind a name to a socket!!!" << endl;
exit(2);
}
nListen = listen(nSocketDesc, QUEUE_SIZE);
if(nListen < 0)
{
cout << "Can't set queue size!!!" << endl;
exit(3);
}
while(true)
{
sockAddrSize = sizeof(struct sockaddr);
nClientSocket = accept(nSocketDesc, (struct sockaddr*) &stClientAddr, &sockAddrSize);
if(nClientSocket < 0)
{
cout << "Can't create a connection's socket!!!" << endl;
exit(4);
}
string temp;
if(read(nClientSocket, buffer, sizeof(buffer)) > 0)
temp = buffer;
if(temp.empty() == true)
continue;
unsigned int i;
for(i = 0; i < temp.size(); i++)
{
if(temp[i] == '/')
break;
else if(temp[i] == '\n')
{
++i;
break;
}
ip_addr += temp[i];
}
if(i == temp.size())
page = "/";
else
{
for(; i < temp.size(); i++)
page += temp[i];
}
connect(nClientSocket, ip_addr, page);
ip_addr = "";
page = "";
}
close(nSocketDesc);
return 0;
}
Łącze się poprzez netcata i wysyłam na nClientSocket stringa np. 'www.google.pl'. Jednak działa to różnie i zwraca błąd, który zwrócił web serwer.
Czy poprawnie wysyłam zapytanie?
Jak mogę zmodyfikować kod bym mógł z przeglądarki łączyć się poprzez mój serwer z dowolną stroną?