Socket programmeren

Status
Niet open voor verdere reacties.
Dat is inderdaad het probleem, je kan nu niet een client hebben op dezelfde computer als de server. Je kan dat probleem oplossen door de poort van de client weer aan te passen en dus ook te veranderen de 'port forwarding' page (externe poort veranderen dan).

Weet je heel zeker dat je de port forwarding goed hebt zitten, en niet ergens een verkeerde poort hebt neergezet ofzo?

Als ik jou was zou ik ook wel zorgen dat je de client op een aparte computer buiten je eigen netwerk test om het zo echt mogelijk te maken. Veel routers hebben ook problemen met het port forwarden van een computer uit het eigen netwerk.

EDIT: zie net in je code dat je bind naar INADDR_ANY, je moet dat wel veranderen in je eigen LAN-ip als je de client programmeert! :P
 
"127.0.0.1" ipv INADDR_ANY? Werkt ook niet... Zou ik anders de 'Port Triggering' optie moeten gebruiken in plaats van 'Virtual Servers'?
 
Haha, ik weet niet wie, maar ik in ieder geval niet xd.
Ik bedoelde eigenlijk 192.168.1.?? van de client ipv 127.0.0.1.

Oja, en port triggering werkt niet want dan moet de host achter de NAT de verbinding hebben geiniteerd.
 
Het zou fijn zijn als diegene zich even zou melden met de code :).

Uhm, weet jij hoe je in C het lokale ip adres vindt, zodat je het niet handmatig hoeft in te vullen?
 
Werkt nog steeds niet helaas... Echt geen idee hoe dat kan. Misschien is het inderdaad gewoon dat het niet werkt binnen hetzelfde netwerk.
 
Haha, gaaf, je hebt verbonden met mijn server, niet waar?

Dat was ik (denk ik). Ik hoop dat je dat niet erg vind.
In mijn code had ik niet eerst bind() gedaan. Misschien moet jij dat wel doen i.v.m. dat port forwarden, maar van dat port forwarden weet ik eigenlijk niets.

In ieder geval weet je nu dat het van buiten af goed gaat. Ik kreeg zelf het bericht dat ik verstuurd had terug in een tweede client.
Ik heb niet opgelet op de poort van mijn client, maar aangezien het er 2 waren denk ik niet dat ze allebei 50505 waren.
Als je wil kan ik jou code voor de client gebruiken om te testen.
Mijn code is een beetje rommelig en een beetje (onnodig) lang. Als je hem toch wil kan ik hem wel posten.
 
Ik zou het fijn vinden als je die code zou kunnen posten :). Ben benieuwd naar verschillen.
 
Hierbij de code. ( Ik weet het, het is niet zo erg nette code)
Het is een aanpassing van eerder programma van mij om sockets uit te proberen.

Code:



//con
#include <winsock.h>
#include <stdio.h>
#include "c:/c++/cm/extr.c"
int STDCALL s_perror(const char *msg, int err);
void error(char *msg)
{
    long f = WSAGetLastError();
    fprintf(stderr,"%d",f);
    s_perror(msg, f);
    WSACleanup();
    exit(1);
}

void
bcopy(void *pbron, void *pbest, int n)
{
 char *p0,*p1;
 int i;
 p0 = pbron;
 p1 = pbest;

 for(i=0;i<n;i++)
   p1[i] = p0[i];
}

#define bzero ZeroMemory

main(int argc, char **argv)
{
 int r;
 WSADATA wsa;
 long f;

 char * servernaam2=0;
 char *serverip87    = "a.b.c.d";
 char  serverip[256] = "a.b.c.d";
 int poort = 50505;
 int sockfd, n;
 struct sockaddr_in server_adres={0};
 struct hostent *server;
 char buffer[256],buffer2[256];

 //pars argumenten
 if( argc>=2 )
 {
     lstrcpy(serverip , argv[1]);
 }
 if( argc>=3 )
 {
     if( sscanf(argv[2],"%d",&poort)==0 )
         printf("Poort %s van commandoregel is ongeldig.\n"
                "Poort wordt %d\n", argv[2], poort);
 }


 r=WSAStartup(0x101,&wsa);
 if ( r )
 {
   fputs("WSAStartup failed", stderr);
   WSACleanup();
   exit(-1);
 }

// r=gethostname(hostname,256);
// f=WSAGetLastError();
// if(r)printf("r=%d f=%d\n",r,f);
// else printf("hostname = %s \n", hostname);


 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 if (sockfd < 0)
     error("ERROR opening socket");

 server_adres.sin_addr.s_addr = inet_addr( serverip );
 printf("%s\n", inet_ntoa(server_adres.sin_addr) );
 printf("voor gethostbyaddr( &server_adres.s_addr )\n");
 server = gethostbyaddr ( (char*) &server_adres.sin_addr, 4, PF_INET);
 printf("na   gethostbyaddr( &server_adres.s_addr )\n");
 if (server == NULL)
 {
   fprintf(stdout,"Host is niet gevonden %s \n",inet_ntoa(server_adres.sin_addr));
 }
 else
 {
   char **s;
   printf("hostname=%s\n", servernaam2=server->h_name);
   printf("hostalias="); s = server->h_aliases;
   if( *s )
   while( *s )printf("%s\n",*(s++));
   else printf("(NULL)\n");

   printf("adreslist="); s = server->h_addr_list;
   if( *s )
   while( *s )bufferuitn( *(s++),4);
   else printf("(NULL)\n");
 }


 server_adres.sin_family = AF_INET;
 //server_adres.s_addr = inet_addr( serverip ); al eerder gezet
 server_adres.sin_port   = htons(poort);


connectsock:
 if( server_adres.sin_port==0 )
 {
     printf("geef poort(50505):");
     poort = getli(poort);
     server_adres.sin_port = htons( poort );
     if( poort==888 )goto stuurbericht;
 }


 printf("maak verbinding met server %s ip=%s poort=%d...",
         servernaam2, inet_ntoa(server_adres.sin_addr),poort);
 WSASetLastError(888);
 if( connect(sockfd,(struct sockaddr*)&server_adres,sizeof(server_adres) ) < 0)
 {
     f = WSAGetLastError();
     printf("\nEr kan geen verbinding gemaakt worden met de server\n");
     printf("f=%d\n",f);
     server_adres.sin_port = 0; goto connectsock;
 }
 else
 {
     struct sockaddr_in dit_adres={0};
     int len = sizeof dit_adres;
     printf("\nverbonden met %s ip=%s poort=%d\n",
            servernaam2, inet_ntoa(server_adres.sin_addr),poort);
     getsockname(sockfd, (struct sockaddr*)&dit_adres, &len);
     printf("\ndeze ip=%s poort=%d\n",
             inet_ntoa(dit_adres.sin_addr),dit_adres.sin_port);
 }

stuurbericht:
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    switch( buffer[0] )
    {
      case 27 : goto cleanup;
      case 'q': goto sluit;
      case '0': closesocket(sockfd); goto stuurbericht;
      case '1': shutdown(sockfd,0);    goto stuurbericht;
      case '2': shutdown(sockfd,1);    goto stuurbericht;
      case '3': shutdown(sockfd,2);    goto stuurbericht;
      case 'o': goto ontvangbericht;
      case 'c': server_adres.sin_port = 0; goto connectsock;
    }

    n = send(sockfd,buffer,strlen(buffer),0);
    if (n < 0)
         error("ERROR writing to socket");

    printf("nsend= %d\n",n);
    if( buffer[0]=='s' )goto stuurbericht;
ontvangbericht:

    bzero(buffer2,256);
    n = recv(sockfd,buffer2,255,0);
    if (n < 0)
         error("ERROR reading from socket");
    printf("n=%d %s\n",n,buffer2);

    if( buffer[0]=='0' || buffer[0]==27 || strcmp(buffer,"quit\n")==0
        || strcmp(buffer,"stop\n")==0);
    else goto stuurbericht;

sluit:
 closesocket(sockfd);
 cleanup:
 WSACleanup();
}
 
Laatst bewerkt:
Hardstikke bedankt, lijkt voor mij ongeveer hetzelfde dus dan zal mijn code ook wel moeten werken van buitenaf (hoop ik).
 
Met de code uit post #11 en #20. Kon ik gewoon connect()en.
Bij de eerste moest ik wel even POORT aanpassen en het goede IP neerzetten in inet_addr(). Daar stond nog een andere (ik denk het interne ip).

Heb jij de tekst kunnen zien die ik verzonden had?
 
Ja helemaal :). Hardstikke bedankt!

Nou moet ik het nog werkende krijgen op een Nintendo DS... :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan