Hej, så skal i lære winsock, så kan du lave netværks sager, det er ganske simpelt faktisk.
jeg vil lige sige det er lavet i microsoft visual c; det kan nok også bruges med andre compilere.
Okay lad og så starte.
Det ville nok være smart at starte ud med at linke winsock libaryet til exe filen så det over hovedet virker, det burde du vide hvordan man gør ellers så skriver jeg det lige ..
Altså du har et projekt klar med en hoved .cpp og en .h fil så siger vi alt+F7 så trykker du på drop down menuen hvor der står Win32 Debug.. vælg All configurations.. klik så på fanebladet link og tilføj wsock32.lib nede i 'object/libary modules'..
så kan det ellers ikke gå hurtigt nok med at trykke ok og komme tilbage til koden, det er jo det sjove ikke sandt?
hop over i din h fil, hvis så kan du taste de sædvanlige windows sager, plus lidt andet, ind så det ser ud lidt som dette:
// MAIN.H
#ifndef _main_h
#define _main_h
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#endif
okay det var så det, så skal vi have en main windows funktion, den skal du lige skrive ovre i c filen, glem nu ikke at include main.h filen..
det ser ca sådan her ud:
// MAIN.CPP
#include "main.h"
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpCmd, int nCmds) {
// her er der lidt kode en gang når der er tid.
}
okay, tilbage i h-filen tilføjer vi så main funktionen, sådan:
// MAIN.H
...
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpCmd, int nCmds);
#endif
prøv lige at compile en gang for at se om det virker, hvis det ikke virker, så se lige hvad der er galt, læs evt. fra starten... ellers så bare fortsæt her
tilbage i cpp file skriver vi nu noget kode..
først tilføjer vi en funktion så vi kan se fejl let i en log fil når programmet er afsluttet.
void logfile(char *s, ...) // denne funktion forklares ikke da det ikke er relevant for selve winsock
{
va_list Marker;
char all[256];
va_start(Marker, s);
vsprintf(all, s, Marker);
va_end(Marker);
FILE *flog=fopen("winsock.log","a+");
fprintf(flog,"%s\\n",all);
fclose(flog);
}
Husk også at lave en reference i h filen lige som med main funktionen
I main funktionen tilføjer vi nogle variabler(jeg laver noget hurtig kode her, du kan evt. også ligge dem i h filen hvis du syntes).
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpCmd, int nCmds) {
WORD version = MAKEWORD(1,1); // word med version information
WSADATA wsaData; // WSA struct
int svar; // den vi returner til.
SOCKET socklen; // en socket struct.
LPHOSTENT lpVaert; // endnu en struct til winsock
SOCKADDR_IN aserver; // gæt...
WSAStartup(version, &wsaData); // så bliver der smidt versions information ind
// i wsa structen.
lpVaert=gethostbyname("chainsofgod.darktech.org"); // funktion navnet siger det, hent
// vært navn.
if (lpVaert==NULL) { // hvis det så går galt ...
logfile("Fejl: gethostbyname() returnerede NULL");
return 0;
}
logfile("gethostbyname() gik fint... fortsætter...");
// så nu sker der lidt spændene.. eller næ..
socklen = socket(AF_INET, // ja vi bruger internet
SOCK_STREAM, // streaming data overførelse
IPPROTO_TCP); // tcp protocol, tak!
if(socklen==INVALID_SOCKET) { // hvis det så går galt
logfile("Fejl: computeren gad ikke at lave en socket :(");
return 0;
}
logfile("Socket lavet... fortsætter");
aserver.sin_family = AF_INET; // ja vi bruger stadig internettet
aserver.sin_addr = *((LPIN_ADDR)*lpVaert->h_addr_list); // så skal vi
// lige have adressen fra lpVaert
saServer.sin_port = htons(80); // vi vil gerne på port 80 (WWW)
svar=connect(socklen, (LPSOCKADDR)&aserver, sizeof(struct sockaddr)); // forbind ...
if(svar==SOCKET_ERROR) { // hvis fejl så..
logfile("Fejl, connect() gik galt, returnerede SOCKET_ERROR");
return 0;
}
logfile("Hurra vi er forbundet... så kan vi gøre hvad det passer os");
// vi kan lige prøve at sende et HTTP request til serveren..
send(socklen, // brug socketen vi er forbundet med
"GET /index.php\\n", // sende buffer
15, 0); // antal bytes og evt. flags 0 her og for det meste
sleep(150); // vi lader lige serveren reagere..
char *modtag[4096]; // pointer til en char, så vi kan modtage data
if(recv(socklen, modtag, sizeof(modtag),0)) {
Sleep(100);
logfile("\\n\\nData fra server:\\n %s", modtag);
}
closesocket(socklen); // lukke lukke forbindelse..
WSACleanup(); // gør rent
PostQuitMessage(0); // luk windows program
Ja, det var så det, en lille hurtig introduktion til winsock, vi fik set på initialisering af sockets, forbindelse samt hvordan man modtager og sender data.. simpelt ikke sandt?..