Главная » C++ энциклопедия » П » Пример работы с сокетами для Window
Категория: C++ энциклопедия » П
  • 85

13 дек 2011

Автор: admin

Писал, когда сам разбирался с этим делом. На базе этого простого примера написано (точнее не совсем на его базе, а скорее при его участии) пара серьезных программок.
Все просто, как в танке. По исходникам разберетесь.

makefile
all: socket.cpp config.h socket.h
    $(CC) socket.cpp


socket.cpp
#include "stdio.h";
#include "socket.h";
#include "config.h";

static char Rec[2048000];

bool SendString(SOCKET s,char* str) {
    int cnt=send(s,str,strlen(str),0);
    if (cnt==SOCKET_ERROR) return(false); else return(true);
    }

char* GetString(SOCKET s) {
    char *str;
    char InBuff[2048];
    int cnt;
    
    strcpy("",Rec);
    while (cnt!=0) {
        memset(&InBuff,0,2048);
        cnt=recv (s, (char*)&InBuff, sizeof(InBuff),0);
        strcat(Rec,InBuff);
        }
    return((char*)&Rec);
    }


int OpenURL(char *url) {
    char *none="";
    char query[2048];
    struct sockaddr_in ssin;
    struct hostent* hp;
    unsigned char strHlp[2048], *pch;
    int PortNum;
    char *http_host;
    char *http_path;

    if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) return(7);
    url+=7;
    if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(1);
    // используем Default'овый номер порта - 80, если не задан другой
    strcpy(strHlp,url);
    pch = strchr((char*)strHlp,':');
    if (pch==NULL) {
        PortNum = 80;
        pch = strchr((char*)strHlp,'/');
        if (pch!=NULL) {
            pch[0] = '\0';
            http_path=pch+1;
            }
        else {
            http_path=none;
            }
        }
    else {
        pch[0] = '\0';
        pch++;
        char *pch1 = strchr((char*)pch,'/');
        if (pch1!=NULL) {
            pch1[0] = '\0';
            http_path=pch1+1;
            }
        else {
            http_path=none;
            }
        PortNum = atoi(pch);
        if(PortNum==0) PortNum = 80;
        }

    // Поучаем IP по имени
    if ((hp=gethostbyname(strHlp))==NULL) return(1);
    http_host=strHlp;

    memset ((char *)&ssin, 0, sizeof(ssin));
    ssin.sin_family = AF_INET;
    ssin.sin_addr.s_addr = htonl(INADDR_ANY);
    ssin.sin_port = 0;
    bind (s, (struct sockaddr *)&ssin, sizeof(ssin));

    s=socket(AF_INET, SOCK_STREAM, 0);
    if (s==INVALID_SOCKET) return(4);

    ssin.sin_family = AF_INET;
    ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
    ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
    ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
    ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
    ssin.sin_port = htons(PortNum);

    printf("Conecting to %d.%d.%d.%d...",
        (unsigned char)hp->h_addr[0],
        (unsigned char)hp->h_addr[1],
        (unsigned char)hp->h_addr[2],
        (unsigned char)hp->h_addr[3]);
    if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) return(3);
    printf("Ok\n");

    strcpy(query,"GET /");
    strcat(query,http_path);
    strcat(query," HTTP/1.0\nHost: ");
    strcat(query,http_host);
    strcat(query,"\nUser-agent: ");
    strcat(query,http_user_agent);
    strcat(query,"\nAccept: */*\n\n");

    printf("%s",query);

    if (!SendString(s,query)) return(5);
    char* str=GetString(s);
    printf("%s",str);
    return(0);
    }

void CloseURL(void) {
    WSACleanup();
    }
                        
void main(void) {              
    int err=OpenURL("http://www.codenet.ru/");
    if (err!=0) {
        printf("Error #%d: WSABASEERR+%d\n",err,
        WSAGetLastError()-WSABASEERR);
        }
    }


config.h

Этот модуль содержит настройки...точнее одну настройку - то что сервер получит в качестве HTTP_USER_AGENT.

char *http_user_agent="Search Engine";
socket.h
#include <windows.h>

int s;
WSADATA lpWSAData;
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.