Winsocks i C

Tags:    c++
Skrevet af Bruger #1276 @ 15.05.2002
winsock tutorial 1

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?..



Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (3)

User
Bruger #3116 @ 15.06.03 12:00
Blocker "send" ikke? Hvorfor venter du så 150 millisekunder?
User
Bruger #6065 @ 02.07.04 23:29
Jeg fattede hat af den artikel ..

syntes ikke du forklarer særlig godt .. Især ikke i starten :(
User
Bruger #8985 @ 07.08.07 12:31
Han forklarer slet intet. Han laver kun små finurlige kommentarer som "Ja, vi bruger internet" ... Wow, det vidste jeg slet ikke, jeg troede vi brugte kakaopulver blandet op med skummetmælk. Det er en 1'er.
Du skal være logget ind for at skrive en kommentar.
t