Socket vraag (beginnende beginner)

Status
Niet open voor verdere reacties.

GreenPiggy

Gebruiker
Lid geworden
3 mrt 2008
Berichten
27
Hallo,

Ik ben net als vele op dit forum aan het "*****" met sockets, maar kom er maar niet uit.
Ik heb tot nu toe deze codes en probeer die met elkaar te laten communiceren op verschillende computers in hetzelfde netwerk. ( het zijn verschillende Tutorials aan elkaar genoopt, ik heb het orginele commentaar er maar bij laten staan ).
Code:
// Dit is de client
#include <winsock.h>
#include <iostream>
using namespace std;
#define MAXDATASIZE 1000
#define HUN_IP "192.168.1.72"

void Startup()
{
   WORD wVersionRequested;
    WSADATA wsaData;
    int err;

/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        /* Tell the user that we could not find a usable */
        /* Winsock DLL.                                  */
        printf("WSAStartup failed with error: %d\n", err);
        exit(1);
}
}

void Cleanup()
{
     WSACleanup();
}

int main(int argc, char *argv[])
{
    Startup();
    int sockfd, aant_bytes;  
    char buf[MAXDATASIZE];
    struct sockaddr_in hun_adres; /* connector's adresinformatie */

    cin.get();

    hun_adres.sin_family = AF_INET;    /* host byte volgorde */
    hun_adres.sin_port = htons(4343); /* short (16 bit), netwerk byte volgorde */ 
    hun_adres.sin_addr.s_addr = inet_addr(HUN_IP);
    memset(&(hun_adres.sin_zero), '\0', 8);  /* rest van de struct op nul */

    buf[aant_bytes] = '\0';
    cin.get();
    printf("Ontvangen: %s",buf);
    cin.get();
    closesocket(sockfd);
    Cleanup();
    return 0;
}

Code:
// en dit moet de server voorstellen.
#include <winsock.h>
#include <iostream>
using namespace std;

void Startup()
{
        WSADATA wsaData;   // als dit niet werkt,
	//WSAData wsaData; // probeer dan dit.

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
        {
            fprintf(stderr, "WSAStartup is mislukt.\n");
            exit(1);
        }
}

void Cleanup()
{
     WSACleanup();
}

main()
{
      Startup();
      int sockfd;
      int backlog = 10;
      int sin_size;
      int new_fd;
      int stop = 1;
      int len, bytes_verzonden;
      struct sockaddr_in mijn_addr;
      struct sockaddr_in hun_addr; // adresinformatie van de 'beller'

      
      sockfd = socket(AF_INET, SOCK_STREAM, 0); 
      mijn_addr.sin_family = AF_INET;         // host byte volgorde
      mijn_addr.sin_port = 4343; // kies willekeurig een ongebruikte poort
      mijn_addr.sin_addr.s_addr = INADDR_ANY;  // gebruik mijn IP adres 
      memset(&(mijn_addr.sin_zero), '\0', 8); // de rest van de struct op nul
      if (bind(sockfd, (struct sockaddr *)&mijn_addr, sizeof(struct sockaddr)) == -1)
      {
      return 1;
      }
      while (stop > 0)
      {
      if (bytes_verzonden =! 1)
      {
      cout << bytes_verzonden;
      }
      int listen(int sockfd, int backlog);
      sin_size = sizeof(struct sockaddr_in);
      new_fd = accept(sockfd, (struct sockaddr *)&hun_addr, &sin_size);
      char *msg = "Bericht overgekomen!!!";
      len = strlen(msg);
      bytes_verzonden = send(sockfd, msg, len, 0);
      }
      cin.get();
      cout << sockfd;
      Cleanup();
      cout << "gelukt";
      cin.get();
}

Als eerste start ik de server en daarna de client, maar er gebeurt nix... :(
( het compilen gaat wel goed).

Alle reacties zijn welkom.
 
in de server:

mijn_addr.sin_port = 4343;
zou moeten zijn
mijn_addr.sin_port = htons(4343);

int listen(int sockfd, int backlog);
is een declaratie van listen, dat kan weg (zit al in winsock.h)
roep listen 1 keer aan na bind
listen( sockfd, backlog);

Waarvoor dient die while lus?, Hij lijkt overbodig.
verstuur bytes naar client met de nieuwe socket new_fd
bytes_verzonden = send(new_fd, msg, len, 0);


in de client:

maak eerst een socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);

maak verbinding met de server (nadat je hun_adres hebt geinitialiseerd)

printf("probeer verbinding te maken met de server...\n");
if( connect(sockfd,(struct sockaddr*)&hun_adres,sizeof(hun_adres)) == SOCKET_ERROR )
printf("connect is mislukt (geen verbinding met de server).\n");
else printf("verbinding met de server is gemaakt.\n");

ontvang data met recv
aant_bytes = recv(sockfd,buf,sizeof(buf),0);
if( aant_bytes == SOCKET_ERROR )
{
aant_bytes = 0;
printf("Er is een fout opgetreden bij het lezen van de socket.\n");
}

en nog een tip:
Zorg voor wat meer uitvoer naar het scherm zodat je weet waar het ongeveer fout gaat.
 
Echt ONWIJS bedankt, nu kan ik eindelijk verder :D
Ik heb de uiteindelijke code er ook nog bij gezet zodat andere er misschien ook nog wat aan hebben :p


De server ( eerst starten)
Code:
#include <winsock.h>
#include <iostream>
using namespace std;

void Startup()
{
        WSADATA wsaData;  
        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
        {
            fprintf(stderr, "WSAStartup is mislukt.\n");
            exit(1);
        }
        else 
        cout << "Initialiseren gelukt" << endl;
}

void Cleanup()
{
     WSACleanup();
}

main()
{
      Startup();
      int sockfd;
      int backlog = 10;
      int sin_size;
      int new_fd;
      int stop = 1;
      int len, bytes_verzonden;
      bool quit = false;
      struct sockaddr_in mijn_addr;
      struct sockaddr_in hun_addr; // adresinformatie van de 'beller'   
         
      sockfd = socket(AF_INET, SOCK_STREAM, 0); 
      
      mijn_addr.sin_family = AF_INET;         // host byte volgorde
      mijn_addr.sin_port = htons(4343); // kies willekeurig een ongebruikte poort
      mijn_addr.sin_addr.s_addr = INADDR_ANY;  // gebruik mijn IP adres 
      memset(&(mijn_addr.sin_zero), '\0', 8); // de rest van de struct op nul
      
      if (bind(sockfd, (struct sockaddr *)&mijn_addr, sizeof(struct sockaddr)) == -1)
      {
      return 1;
      }
      else 
      cout << "Binden gelukt" << endl << "Wachten op beller"<< endl;      
      listen( sockfd, backlog);      


      sin_size = sizeof(struct sockaddr_in);
      new_fd = accept(sockfd, (struct sockaddr *)&hun_addr, &sin_size);
      cout << "Client geaccepteerd" << endl;
      char *msg = "Bericht";
      len = strlen(msg);
      bytes_verzonden = send(new_fd, msg, len, 0);
      cout << "Bericht verstuurd!" << endl;
      Cleanup();
      cout << "Gelukt met het versturen van het bericht:";
      cout << msg;
      cin.get();
}
De client ( daarna starten)
Code:
#include <winsock.h>
#include <iostream>
using namespace std;
#define MAXDATASIZE 100
#define HUN_IP "192.168.1.73"

void Startup()
{
        WSADATA wsaData;  
        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
        {
            fprintf(stderr, "WSAStartup is mislukt.\n");
            exit(1);
        }
        else 
        cout << "Initialiseren gelukt" << endl;
}

void Cleanup()
{
     WSACleanup();
}

int main(int argc, char *argv[])
{
    Startup();
    int sockfd; 
    int aant_bytes;  
    char buf[MAXDATASIZE];
    struct sockaddr_in hun_adres;
    
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    hun_adres.sin_family = AF_INET;    /* host byte volgorde */
    hun_adres.sin_port = htons(4343); /* short (16 bit), netwerk byte volgorde */ 
    hun_adres.sin_addr.s_addr = inet_addr(HUN_IP);
    memset(&(hun_adres.sin_zero), '\0', 8);  /* rest van de struct op nul */
    
    printf("probeer verbinding te maken met de server...\n");
    
    if( connect(sockfd,(struct sockaddr*)&hun_adres,sizeof(hun_adres)) == SOCKET_ERROR )
    {
    printf("connect is mislukt (geen verbinding met de server).\n");
    }
    else 
    printf("verbinding met de server is gemaakt.\n");
    

    aant_bytes = recv(sockfd,buf,sizeof(buf),0);
    if( aant_bytes == SOCKET_ERROR )
    {
    perror("recv");
    aant_bytes = 0;
    printf("Er is een fout opgetreden bij het lezen van de socket.\n");
    }
    buf[aant_bytes] = '\0';
    cout << buf << endl;

    cin.get();
    Cleanup();
    return 0;
}
 
Ik ben verder gegaan met programmeren van sockets en heb een aardig programmatje in elkaar geknusselt (vind ik zelf). Het moet verbinding kunnen maken met een andere computer waar het programmatje ook draait en dan er mee chatten. ( een chatprogramma ) Het probleem is dat je er alleen maar omstebeurt mee kan chatten en niet tegelijk. Kunnen jullie mij vertellen hoe ik recv() en send() tegelijk kan laten werken???
Ik heb al over "Multi-Threading" gehoord maar kon er niet achter komen of dat de oplossing was. Als dat wel de oplossing is weet iemand een goede tutorial???

Thx
Ik heb de code er ook maar bijgezet (leek met niet er nodig maar toch).

Main.cpp:
Code:
#include <winsock.h>
#include <iostream>
#include "Initialiseren.h"
using namespace std;

int main()
{   
    int keuze1;
    int keuze2;

    
    if (Startup() == 1)
    {
    cout << "Initialiseren:\t Mislukt"<<endl;
    End();
    }
    else
    cout << "Initialiseren:\t Geslaagd"<<endl;
    
    cout << "Chatsessie starten?"<<endl;
    cout << "1. Ja"<<endl;
    cout << "2. Nee"<<endl;
    cin >> keuze1;
    cin.ignore();
    if (keuze1 == 1)
    cout << "Chatsessie wordt gestart..."<<endl<<endl;
    else
    End();
    cout << "Wilt u server of client zijn?"<<endl;
    cout << "1. Server"<<endl;
    cout << "2. Client"<<endl;
    cin >> keuze2;
    cin.ignore();
    if (keuze2 == 1)
    Server();
    else if (keuze2 == 2)
    Client();
    else
    End();
    
        
    cin.get();
    End();
}

Initialiseren.h
Code:
#include <winsock.h>
#include <iostream>
using namespace std;

int port;
char reactie[2] = "Y";
char ip[16];
int socket1, socket2;
int size;
int ontvangen_bytes, verstuurde_bytes;
char bericht[100];
char textbuffer[100];
struct sockaddr_in mijn_addr;
struct sockaddr_in hun_addr;

void ChatServer();
void ChatClient();

int Startup()
{
    WSADATA wsadata;
    if ((WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0)
    return 1;
    else
    return 0;
}

void Cleanup()
{
     WSACleanup();
}

void End()
{
     cout << "Druk op een toets om het programma te beeindigen...";
     cin.get();
     Cleanup();
     exit(1);
}

void Socket()
{

     socket1 = socket(PF_INET, SOCK_STREAM, 0);
     if (socket1 == -1)
     {
     cout << "Socket creeren:\t Mislukt"<<endl;
     End();
     }
     else
     cout << "Socket creeren:\t Geslaagd "<<endl; 
} 

void Server()
{
     cout << "Server wordt gestart..."<<endl<<endl;
     Socket();
     cout << endl << "Voer port in (boven 1054, bijv. 4343):";
     cin >> port;
     cin.ignore();
     
     mijn_addr.sin_family = AF_INET;
     mijn_addr.sin_port = htons(port);
     mijn_addr.sin_addr.s_addr = INADDR_ANY;
     memset(mijn_addr.sin_zero, '\0', sizeof mijn_addr.sin_zero);
     
     if ((bind(socket1, (struct sockaddr *)&mijn_addr, sizeof mijn_addr)) == -1)
     {
     cout << "Binden aan poort:\t Mislukt"<<endl<<endl;
     End();
     }
     else
     cout << "Binden aan poort:\t Geslaagd"<<endl<<endl;
     cout << "Wachten op Client..."<<endl;     
     listen(socket1, 5);
     size = sizeof hun_addr;
     socket2 = accept(socket1, (struct sockaddr *)&hun_addr, &size);
     cout <<endl<< "Client gevonden... Wachten op reactie"<<endl;
     
     ontvangen_bytes = recv(socket2,textbuffer,sizeof(textbuffer),0);
     size = strlen(reactie);
     verstuurde_bytes = send(socket2, reactie, size, 0);
     

     if (reactie[0] == 'Y')
     cout << "Verbinden met client:\t Geslaagd"<<endl;
     
     else
     {
     cout << "Verbinden met client:\t Mislukt"<<endl;
     End();
     }
     
     ChatServer();
     
     
}

void Client()
{

     cout << "Client wordt gestart..."<<endl<<endl;
     Socket();
     cout << endl <<"Voer het IP adres in: ";
     cin >> ip;
     cin.ignore();
     cout << "Voer port in (boven 1054, bijv. 4343): ";
     cin >> port;
     cin.ignore();
    
     hun_addr.sin_family = AF_INET;
     hun_addr.sin_port = htons(port);
     hun_addr.sin_addr.s_addr = inet_addr(ip);
     memset(&(hun_addr.sin_zero), '\0', 8);
     socket2 = socket1;
     cout << endl << "Bezig met verbinden naar server..."<<endl<<endl;
     
     if(connect(socket2,(struct sockaddr*)&hun_addr,sizeof(hun_addr)) == -1 )
     {
     cout << "Verbinden met server mislukt"<<endl;
     End();
     }
     else
     cout << "Server gevonden... Wachten op reactie"<<endl;  
        
     size = strlen(reactie);
     verstuurde_bytes = send(socket2, reactie, size, 0);
     ontvangen_bytes = recv(socket2,textbuffer,sizeof(textbuffer),0);
     
     if (textbuffer[0] == 'Y')
     cout << "Verbinden met host:\t Geslaagd"<<endl;
     else
     {
     cout << "Verbinden met host:\t Mislukt"<<endl;
     End();
     }
     
     ChatClient();
        
}

void ChatServer()
{
     while(1)
     {
     cout << "Wachten op reactie..."<<endl<<endl;
     ontvangen_bytes = recv(socket2,textbuffer,sizeof(textbuffer),0);
     textbuffer[ontvangen_bytes] = '\0';
     cout << "Client typte:\t\t\t\t "<<textbuffer<<endl<<endl;
     cout << "Voer een bericht in:"<<endl;
     cin.getline (bericht,100);
     size = strlen(bericht);
     verstuurde_bytes = send(socket2, bericht, size, 0);
     }
}

void ChatClient()
{
     while (1)
     {
     cout << "Voer een bericht in:"<<endl;
     cin.getline (bericht,100);
     size = strlen(bericht);
     verstuurde_bytes = send(socket2, bericht, size, 0);
     cout << "Wachten op reactie..."<<endl<<endl;
     ontvangen_bytes = recv(socket2,textbuffer,sizeof(textbuffer),0);
     textbuffer[ontvangen_bytes] = '\0';
     cout << "Client typte:\t\t\t\t "<<textbuffer<<endl<<endl;
     }
}
 
je kunt een loop maken met lezen/schrijven/lezen/schrijven etc etc. je moet dan wel even wat op zetten zodat het lezen niet eeuwig duurt totdat er iets te lezen valt
 
je moet dan wel even wat op zetten zodat het lezen niet eeuwig duurt totdat er iets te lezen valt

En hoe doe ik dat???

Ik heb dit zo via internet geprobeerd (werkte niet)

Code:
setsockopt(socket2, SOL_SOCKET, SO_RCVTIMEO, &timeval, sizeof(timeval));
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan