Пример работы с сокетами для Windows
Комментариев:
Писал, когда сам разбирался с этим делом. На базе этого
простого примера написано (точнее не совсем на его
базе, а скорее при его участии) пара серьезных
программок.
Все просто, как в танке. По исходникам разберетесь.
makefile
all: socket.cpp config.h socket.h$(CC) socket.cpp
Download this code: makefile.txt
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);}}
Download this code: socket.cpp
config.h
Этот модуль содержит настройки…точнее одну настройку — то что сервер получит
в качестве HTTP_USER_AGENT.
char *http_user_agent="Search Engine";
Download this code: config.h
socket.h
#include <windows.h>int s;WSADATA lpWSAData;
Download this code: socket.h