Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » Visual C++ - Все статьи »

Обсудить на форуме Обсудить на форуме

Пример работы с сокетами для Window

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

Все просто, как в танке. По исходникам разберетесь.

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;

Может пригодится:


Автор: mike.nov.ru
Прочитано: 12282
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (1)

Прислал: Sergio
Всё правильно описано!

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру