Приклад роботи з сокетами для Windows

Писав, коли сам розбирався з цією справою. На основі цього найпростішого прикладу написано (точніше не зовсім на його основі, а скоріше за його участі) пара серйозних програм.

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

char * OpenURL ( char * url ) < WSADATA lpWSAData ; SOCKET s;

// Ініціалізація бібліотеки Ws2_32.dll. if (WSAStartup (MAKEWORD (1, 1), & lpWSAData)! = 0) return (NULL);

char * http_host = strdup (url); // Ім'я хоста (HTTP_HOST) int port_num = 80; // Стандартний номер порту (HTTP_PORT) char * http_path = NULL ; // Шлях (REQUEST_URI)

char * pch = strchr (http_host, ':'); if (! pch) < pch = strchr (http_host, '/'); if (pch) < * pch = 0; http_path = strdup (pch + 1); > else http_path = strdup (""); > else < * pch = 0; pch ++; char * pch1 = strchr (pch, '/'); if (pch1) < * pch1 = 0; http_path = strdup (pch1 + 1); > else http_path = strdup ("");

port_num = atoi (pch);

if ( port_num == 0 ) port_num = 80 ; >

// Відкриваємо сокет s = socket (AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) < free (http_host); free (http_path); return (NULL); >

// Заповнюємо структуру sockaddr_in struct sockaddr_in ssin; memset ((char *) & ssin, 0, sizeof (ssin)); ssin. sin_family = AF_INET; ssin. sin_addr. S_un. S_un_b. s_b1 = hp - & gt; h_addr [0]; ssin. sin_addr. S_un. S_un_b. s_b2 = hp - & gt; h_addr [1]; ssin. sin_addr. S_un. S_un_b. s_b3 = hp - & gt; h_addr [2]; ssin. sin_addr. S_un. S_un_b. s_b4 = hp - > h_addr [3]; ssin. sin_port = htons (port_num);

// З'єднуємося з хостом if (connect (s, (sockaddr *) &ssin, sizeof(ssin)) == - 1) < free (http_host); free (http_path); printf ("Error \ n"); return (NULL); > printf ("Ok \ n");

// Формуємо HTTP запит char * query = (char *) malloc (2048);

strcpy (query, "GET /"); strcat (query, http_path); strcat (query, "HTTP/1.0 \n Host:"); strcat (query, http_host); strcat (query, " \n User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" ) ; strcat (query, "\n Accept: */* \n \n");

// Виводимо HTTP запит printf ("%s", query);

// Відправляємо запит серверу int cnt = send (s, query, strlen (query), 0);

// Звільняємо пам'ять free (http_host); free (http_path); free (query);

// Перевіряємо, чи не відбулося помилки при відправці запиту на сервер if (cnt == SOCKET_ERROR) return (NULL);

int size = 1024 * 1024; // 1Mb char * result = (char *) malloc (size); strcpy (result, ""); char * result_ptr = result;

// Деініціалізація бібліотеки Ws2_32.dll WSACleanup ();