CodeNet / Языки программирования / C / C++ / Borland C++ Builder / Интернет и сеть
CodeNet / Приложения / Интернет. Сеть
CodeNet / Приложения / Интернет. Сеть
Пример работы с сокетами для Window
Автор: mike
Дата: 19 декабря 2002 года
Дата: 19 декабря 2002 года
Писал, когда сам разбирался с этим делом. На базе этого простого примера написано (точнее не совсем на его базе, а скорее при его участии) пара серьезных программок.
Все просто, как в танке. По исходникам разберетесь.
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;