Код:
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32")
#define CHECK_URL(x,y) if (x) {fprintf(stderr, ToConsole(y)); return NULL;}
struct sockaddr_in sa;
char buf[1024];
char conBuf[1024];
char* ToConsole(char* str)
{
CharToOem(str, conBuf);
return conBuf;
}
char* parseURL(char* _url)
{
char *ptr = strchr(_url, ':');
CHECK_URL(ptr == NULL, "Имя протокола отсутствует.\n");
*ptr = '\0';
CHECK_URL(stricmp(_url, "http") != 0, "Недопустимое имя протокола.\n");
CHECK_URL(strncmp(++ptr, "//", 2) != 0, "Неправильный формат URL.\n");
ptr+=2;
char* eptr = strchr(ptr, '/');
CHECK_URL(eptr == NULL, "Нет имени страницы");
strcat(buf, eptr+1);
*eptr = '\0';
eptr = strchr(ptr, ':');
if (eptr != NULL)
{
char* leptr;
short port = (short)strtol(eptr+1,&leptr, 10);
if (eptr == leptr) port = 80;
*eptr = '\0';
sa.sin_port = htons(port);
}
else
sa.sin_port = htons(80);
struct hostent *he = gethostbyname(ptr);
if (he == NULL)
{
he = gethostbyaddr(ptr, strlen(ptr), AF_INET);
CHECK_URL(he == NULL, "Недопустимое имя сервера");
}
memcpy(&sa.sin_addr.S_un.S_addr, he->h_addr, sizeof(sa.sin_addr.S_un.S_addr));
return buf;
}
int main(int argc, char **argv)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
fprintf(stderr, ToConsole("Невозможно инициализировать Windows Sockets.\n"));
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
fprintf(stderr, ToConsole("Максимально доступная версия Windows Sockets : %d.%d - недопустима."),
(int)(LOBYTE( wsaData.wVersion )),(int)(HIBYTE( wsaData.wVersion )));
WSACleanup( );
return 0;
}
struct protoent *pe = getprotobyname("tcp");
SOCKET sock = socket(AF_INET, SOCK_STREAM, pe->p_proto);
strcpy(buf, "GET /");
if (argc >= 2)
{
if (parseURL(argv[1]) == NULL)
{ closesocket(sock); WSACleanup(); return 0; }
}
else
parseURL("http://localhost:80/index.php");
strcat(buf, " HTTP/1.0\n\n");
sa.sin_family = AF_INET;
memset(&sa.sin_zero, 0, sizeof(sa.sin_zero));
if (connect( sock, (struct sockaddr*)(&sa), sizeof(sa)) != 0)
{
fprintf(stderr, ToConsole("Ошибка при подключении №%d\n"), WSAGetLastError());
closesocket(sock); WSACleanup(); return 0;
}
send(sock, buf, strlen(buf), 0);
char recvbuf[1024];
int received = 0;
while((received = recv(sock,recvbuf, sizeof(recvbuf)-1,0)) > 0)
{
recvbuf[received] = '\0';
fprintf(stdout, recvbuf);
}
closesocket(sock);
WSACleanup();
}
Да кстати не сказал ..