Gå til innhold

Enkleste socket program mulig å lage?


Anbefalte innlegg

Ok, jeg lurer på en ting. Jeg har sett på endel socket programmering tutorial og sett på endel kode. Jeg la merke til at det var egentlig mye kode for og gjøre veldig lite. Så jeg lurer på om noen av dere kan paste en _ENKEL_ måte og sende et ord. Trenger heller ikke og ha med div. feilrapporter i programmet.

 

Dette hadde hjelpt meg myye.

Lenke til kommentar
Videoannonse
Annonse

Sockets er nesten helt likt i Windows og Linux. Det er kun noen detaljer som man må passe på (f.eks. initialisere WS2_32.DLL i Windows).

 

Det finnes en bra introduksjon til sockets som heter "Beej's Guide to Network Programming - Using Internet Sockets". Du finner den via Google.

Lenke til kommentar

Hva er det som er vanlig og gjøre? Er det vanlig å lage en funksjon som man kaller WsaStartup() slik som dette?

 


#include <winsock.h>
#include <iostream>

void WSAstartup() {
    WSADATA wsaData;
   
   if(WSAStartup(MAKEWORD(1, 1) &wsaData) =! 0) {
                             
          fprintf(stderr, "WSA STARTUP FAILED!\n");
          exit(1);
          }

int main() {
   WSAstartup();
   
                             
   return 0;
}
                                     
           


 

Eller gjøre det i main() slik som dette?

 

#include <winsock.h>
#include <iostream>

int main() {
   WSADATA wsaData;
   
   if(WSAStartup(MAKEWORD(1, 1) &wsaData) =! 0) {
                             
          fprintf(stderr, "WSA STARTUP FAILED!\n");
          exit(1);
          }
                             
   
   
   return 0;
}

 

 

Hva i all verden gjør MAKEWORD(1, 1)? Trenger man virkelig det?

Lenke til kommentar

1) Windowsprogrammering hører hjemme i Windowsprogrammeringsforumet ;)

 

2) Vær oppmerksom på forskjellen på =! og !=. Det første betyr "sett venstre side til å være negasjonen av høyre side". Det andre betyr "er ikke lik". Du mener sannsynligvis å bruke !=.

 

3) Tror dette er det enkleste socket-programmet jeg har liggende...

 

 

#include <cstring>
#include <iostream>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

const int port = 5842;

int main(int argc, char* argv[])
{
   using namespace std;
   if (argc < 2) {
       cerr << "Usage: " << argv[0] << " hostname\n";
       return 1;
   }
   int sockfd = socket(AF_INET, SOCK_STREAM, 0);


   cout << "Looking up hostname... " << flush;
   hostent* he = gethostbyname(argv[1]);
   if (!he) {
       cerr << "Error! Unable to lookup hostname! Exiting...\n";
       return 1;
   }
   cout << "done.\nHostname: " << he->h_name << "\n";
   cout << "IP-address: "
       << inet_ntoa(*((in_addr*)he->h_addr)) << "\n" << endl;


   sockaddr_in dest_addr;
   dest_addr.sin_family = AF_INET;
   dest_addr.sin_port = htons(5842);
   dest_addr.sin_addr = *((in_addr*)he->h_addr);
   memset(&(dest_addr.sin_zero), '\0', 8);

   cout << "Connecting... " << flush;
   if (connect(sockfd, (sockaddr*)&dest_addr, sizeof(sockaddr))) {
       perror("connect");
       return 1;
   }
   cout << "done" << endl;


   unsigned int a = 0;
   unsigned int b = 0;
   unsigned int c = 0;
   unsigned int d = 0;


   cout << "\nReceiving a... " << flush;

   recv(sockfd, &a, 4, 0);
   cout << a << "\nReceiving b... " << flush;
   recv(sockfd, &b, 4, 0);
   cout << b << "\nReceiving c... " << flush;
   recv(sockfd, &c, 4, 0);
   cout << c << "\nReceiving d... " << flush;
   recv(sockfd, &d, 4, 0);
   cout << d << endl;

   unsigned int sum = a + b + c + d;
   cout << "\nSum: " << sum << endl;

   cout << "Sending the sum... " << flush;
   send(sockfd, &sum, 4, 0);
   cout << "done" << endl;


   char buf[500];
   cout << "Receiving result... " << flush;
   recv(sockfd, &buf, 500, 0);
   cout << "done" << endl;

   cout << "The result is: " << buf << endl;

   cout << "\nClosing socket... " << flush;
   close(sockfd);
   cout << "done" << endl;
return 0;
}

Lenke til kommentar

Takker for svar :D

 

Men et par spm. ang. koden..

 

1) Jeg har sett at det ofte står int main(int argc, char* argv[]), men hvilken funksjon har de i koden?

 

2) return 1? Hva gjør det? Er vant med return 0 :p

 

3) Noen som vet om en god Winsock programmeringsbok?

Endret av Gromguten
Lenke til kommentar

int argc(argument count) er antall parameter sendt til .exe programmet, argv(argument vector) er hvert parameter (det første er alltid fulle navnet til programmet C:\Windows\Calc.exe f.eks.)

 

return 1 betyr at programmet avsluttet med feil, så kan du f.eks. i et batch script skrive

 

IF ERRORLEVEL 1 GOTO SocketFailed

GOTO End

:SocketFailed

ECHO Socket ga tilbake feil

:End

Lenke til kommentar
det første er alltid fulle navnet til programmet C:\Windows\Calc.exe f.eks.

Ikke heelt riktig -- dette er til en viss grad plattformavhengig. Under Linux blir argv[0] satt til kommandoen som ble kjørt for å starte programmet, enten det er relativ eller absolutt plassering.

Lenke til kommentar

Jeg og har lurt litt nå en stund og starte med socket programmering. Noen anbefalinger av bøker for en som aldri har drevet med noen form for socket programmering før?

 

- Jeg lurer også på en ting ang. return verdier. Jeg har sett noen ganger at -1 blir brukt istedenfor 0 og 1. Hva vil det si?

Endret av Kjeksen
Lenke til kommentar
- Jeg lurer også på en ting ang. return verdier. Jeg har sett noen ganger at -1 blir brukt istedenfor 0 og 1. Hva vil det si?

Ingenting. 0 betyr riktig utførelse, alt annet betyr gal utførelse. Man kan velge at en vil representere feil med forskjellige tall for å kunne identifisere hva som gikk galt, eller man kan velge å si at feil er feil og returnere samme tall uansett hva, slik jeg valgte i mitt program.

Lenke til kommentar
det første er alltid fulle navnet til programmet C:\Windows\Calc.exe f.eks.

Ikke heelt riktig -- dette er til en viss grad plattformavhengig. Under Linux blir argv[0] satt til kommandoen som ble kjørt for å starte programmet, enten det er relativ eller absolutt plassering.

Er ikke det også avhengig av programmeringsspråk? Mener å huske at det er forskjell på java og c. Kan også være at jeg har brukt java på windows og c i linux.

 

For de som ønsker en god bok, så har jeg ingen tips. Det beste tipset er å se på Beej guiden som er nevnt tidligere. Den er bra å ha som et utgangspunkt.

Lenke til kommentar

Hmm, har et lite problem her. Hva skal jeg linke til? har ingen filer på dataen som heter winsock32.lib eller noe sånt? Og hva er forskjellen på winsock 1 og 2?

Hvordan "linker" man med Dev++?

 

Får ikke svar på windows programmering delen på forumet.

Endret av Gromguten
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...