Avatar billede quiw Nybegynder
29. august 2005 - 13:30 Der er 24 kommentarer og
1 løsning

Char og Winsock

Hej :)
Har fundet en source som jeg videre udviklede på.. Men kan ikke få den til at sammenligne recv med noget char.. Den giver fejl ved accept socket :S .. Hvordan kan det være ?.. Bruger dev-c++ og Min source er:

#include <stdio.h>
#include <winsock2.h>

int main() {

    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 0;
    }

    // Bind the socket.
    sockaddr_in service;

    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr( "10.92.5.59" );
    service.sin_port = htons( 80 );

    if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
        printf( "bind() failed.\n" );
        closesocket(m_socket);
        return 0;
    }
   
    // Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");

    // Accept connections.
    SOCKET AcceptSocket;

    printf( "Waiting for a client to connect...\n" );
    while (1) {
        AcceptSocket = SOCKET_ERROR;
        while ( AcceptSocket == SOCKET_ERROR ) {
            AcceptSocket = accept( m_socket, NULL, NULL );
        }
        printf( "Client Connected.\n");
        m_socket = AcceptSocket;
        break;
    }
   
    // Send and receive data.
    start:
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[100] = "Hello Daddy, What can i do for you ?";
    char recvbuf[50];
    char test[50];

    send( m_socket, sendbuf, strlen(sendbuf), 0 );
    recv( m_socket, recvbuf, 32, 0 );
    if ( strcmpi ( recvbuf, "quit" ) == 0
    {
        send( m_socket, "Goodbye!", strlen(sendbuf), 0 );
        return 0;
    }
    else
    {
        send( m_socket, "Unkown Command", strlen(sendbuf), 0 );
    }
   
    goto start;

    return 0;
}
Avatar billede arne_v Ekspert
29. august 2005 - 13:44 #1
du mangler ihvertfald en ) i linie 63
Avatar billede arne_v Ekspert
29. august 2005 - 13:45 #2
og så får jeg en warning på SOCKET og sign unsigned værdier

men det er kun en warning
Avatar billede quiw Nybegynder
29. august 2005 - 13:52 #3
Omg.. Den fejl havde jeg ik lige spottet.. Men har stadig en fejl.. Når jeg connecter via telnet.. Og trykker på keys.. Så sender den det samme konstant.. Det skal gerne ende med såen at når jeg skriver "quit" i buffer så lukker den ned.. :P Men tror kun den sender 1 tegn af gangen.. og vil gerne have den til at sende et helt ord...
Avatar billede arne_v Ekspert
29. august 2005 - 14:06 #4
der er ingen garanti for hvordan recv læser om det bliver 1 gang med quit eller
4 gange med et bogstav af gangen

put en while løkke omkring recv
Avatar billede arne_v Ekspert
29. august 2005 - 14:06 #5
recv( m_socket, recvbuf, 32, 0 );
    if ( strcmpi ( recvbuf, "quit" ) == 0

recv nulterminerer ikke strengen så det test går ikke sandsyneligvis galt
Avatar billede arne_v Ekspert
29. august 2005 - 14:07 #6
send( m_socket, "Goodbye!", strlen(sendbuf), 0 );

strlen(sendbuf) er ikke længden af "Goodbye!"
Avatar billede quiw Nybegynder
29. august 2005 - 14:13 #7
Mener mere.. Hvordan jeg kan sende kommandoer fra telnet til server..
Såen jeg f.eks kan lave et online spil osv..
Avatar billede quiw Nybegynder
29. august 2005 - 14:28 #8
Okay har ryddet lidt op i koden.. Og forstået noget af det du forklarede.. Men det virker stadig ik :(

#include <stdio.h>
#include <winsock2.h>

int main() {

    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 0;
    }

    // Bind the socket.
    sockaddr_in service;

    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr( "10.92.5.59" );
    service.sin_port = htons( 80 );

    if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
        printf( "bind() failed.\n" );
        closesocket(m_socket);
        return 0;
    }
   
    // Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");

    // Accept connections.
    SOCKET AcceptSocket;

    printf( "Waiting for a client to connect...\n" );
    while (1) {
        AcceptSocket = SOCKET_ERROR;
        while ( AcceptSocket == SOCKET_ERROR ) {
            AcceptSocket = accept( m_socket, NULL, NULL );
        }
        printf( "Client Connected.\n");
        m_socket = AcceptSocket;
        break;
    }
   
    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[100];
    char recvbuf[50];
    char messages[20];

    send( m_socket, "Welcome... Enter a Command: ", 32, 0 );
    start:
    recv( m_socket, recvbuf, 32, 0 );
    if ( strcmpi ( recvbuf, "quit" ) == 0 )
    {
        send( m_socket, "Goodbye!", 32, 0 );
        return 0;
    }
    else
    {
        send( m_socket, "Unkown Command", 32, 0 );
    }
   
    goto start;

    return 0;
}
Avatar billede arne_v Ekspert
29. august 2005 - 14:29 #9
prøv og læs i en while løkke indtil du modtager et linie skift !
Avatar billede quiw Nybegynder
29. august 2005 - 14:35 #10
Såen her:
#include <stdio.h>
#include <winsock2.h>

int main() {

    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 0;
    }

    // Bind the socket.
    sockaddr_in service;

    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr( "10.92.5.59" );
    service.sin_port = htons( 80 );

    if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
        printf( "bind() failed.\n" );
        closesocket(m_socket);
        return 0;
    }
   
    // Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");

    // Accept connections.
    SOCKET AcceptSocket;

    printf( "Waiting for a client to connect...\n" );
    while (1) {
        AcceptSocket = SOCKET_ERROR;
        while ( AcceptSocket == SOCKET_ERROR ) {
            AcceptSocket = accept( m_socket, NULL, NULL );
        }
        printf( "Client Connected.\n");
        m_socket = AcceptSocket;
        break;
    }
   
    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    int x=0;
    char sendbuf[100];
    char recvbuf[50];

    send( m_socket, "Welcome... Enter a Command: ", 32, 0 );
    do
    {
    recv( m_socket, recvbuf, 32, 0 );
    if ( strcmpi ( recvbuf, "quit" ) == 0 )
    {
        send( m_socket, "Goodbye!", 32, 0 );
        return 0;
    }
    else
    {
        send( m_socket, "Unkown Command", 32, 0 );
    }
    }
    while(x!=1);


    return 0;
}
Avatar billede quiw Nybegynder
29. august 2005 - 15:08 #11
Hm.. Kan du ikke give mig et eksempel på hvordan jeg skal lave et while loop ? Og samtidig putte dem i den samme variable.. ? Ville være dejligt :P
Avatar billede arne_v Ekspert
29. august 2005 - 15:27 #12
konstruktion som den her er ofte brugt:

  /* read data */
  p=(char *)&msg;
  ix=0;
  while((len=recv(sd2,p+ix,sizeof(msg)-ix,0))>0) {
    ix=ix+len;
  }


[den her læser dog til client lukker - måske vil du kun læse til newline]
Avatar billede quiw Nybegynder
29. august 2005 - 23:17 #13
Yeah den skal læse til jeg trykker enter.. :) Eller newline som du siger :)
Avatar billede quiw Nybegynder
30. august 2005 - 13:26 #14
Arne.. :( Savner lidt hjælp :P Hehe..
Avatar billede arne_v Ekspert
30. august 2005 - 15:18 #15
måske

  /* read data */
  p=(char *)&msg;
  ix=0;
  while(memchr(p,'\n',ix)==NULL)
    len=recv(sd2,p+ix,sizeof(msg)-ix,0));
    ix=ix+len;
  }
Avatar billede arne_v Ekspert
30. august 2005 - 15:18 #16
men husk at der evt. godt kan komme noget tekst efter \n som du skal have overført til
næste read
Avatar billede quiw Nybegynder
30. august 2005 - 19:07 #17
Umiddelbart kan jeg ikke få det til at virke.. Har rodet med det en del nu.. Ville være meget rart hvis du ku ligge det på min kode og evt. teste det.. For ser ik ud til min vil :S Nok bare mig der gør noget forkert her..
Avatar billede arne_v Ekspert
31. august 2005 - 22:04 #18
hvordan ser koden ud nu ?
Avatar billede quiw Nybegynder
01. september 2005 - 08:47 #19
Indtil videre ser den såen her ud men det fungere ik rigtigt:

#include <stdio.h>
#include <winsock2.h>

int main() {

    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 0;
    }

    // Bind the socket.
    sockaddr_in service;

    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr( "10.92.5.59" );
    service.sin_port = htons(80);

    if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
        printf( "bind() failed.\n" );
        closesocket(m_socket);
        return 0;
    }
   
    // Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");

    // Accept connections.
    SOCKET AcceptSocket;

    printf( "Waiting for a client to connect...\n" );
    while (1) {
        AcceptSocket = SOCKET_ERROR;
        while ( AcceptSocket == SOCKET_ERROR ) {
            AcceptSocket = accept( m_socket, NULL, NULL );
        }
        printf( "Client Connected.\n");
        m_socket = AcceptSocket;
        break;
    }
   
    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    int x=0;
    char sendbuf[100];
    char recvbuf[50];

    send( m_socket, "Welcome... Enter a Command: ", 28, 0 );
    do
    {
    recv( m_socket, recvbuf, 32, 0 );
    p=(char *)&msg;
    ix=0;
    while(memchr(p,'\n',ix)==NULL)
    len=recv(sd2,p+ix,sizeof(msg)-ix,0));
    ix=ix+len;
    }
    if ( strcmpi ( recvbuf, "quit" ) == 0 )
    {
        send( m_socket, "Goodbye!", 32, 0 );
        printf ("Client Disconnected. \n");
        return 0;
    }
    else
    {
        send( m_socket, "Unkown Command", 32, 0 );
    }
    }
    while(x!=1);


    return 0;
}
Avatar billede arne_v Ekspert
02. september 2005 - 22:07 #20
fungerer ikke rigtigt er vist en underdrivelse

det compiler ikke

p.g.a. uerklærede variable
Avatar billede arne_v Ekspert
02. september 2005 - 22:24 #21
eksempel som virker (men ikke gør noget):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <windows.h>
#include <errno.h>

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  int sd,sd2,status,len,ix;
  char cmd[100],*p;
  struct sockaddr_in local;
  /* windows specifik */
  WSAStartup(0x0101,&WSAData);
  /* create socket */
  sd=socket(AF_INET,SOCK_STREAM,0);
  if(sd<0)
  {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  /* bind socket */
  local.sin_family=AF_INET;
  local.sin_port = htons(1234);
  local.sin_addr.s_addr = INADDR_ANY;
  status=bind(sd,(struct sockaddr *)&local,sizeof(local));
  if(status<0)
  {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  /* listen socket */
  status=listen(sd,5);
  if(status<0)
  {
      printf("Error listening socket: %s\n",strerror(errno));
      goto fin;
  }
  /* accept connection */
  sd2=accept(sd,0,0);
  if(sd2<0)
  {
      printf("Error accepting socket: %s\n",strerror(errno));
      goto fin;
  }
  /* read data */
  p=(char *)&cmd;
  ix=0;
  while((len=recv(sd2,p+ix,1,0))>0)
  {
    ix=ix+len;
    if(cmd[ix-1]=='\n')
    {
        cmd[ix-1]='\0';
        printf("CMD: %s\n",cmd);
        ix=0;
    }
  }
fin:
  /* close sockets */
  closesocket(sd2);
  closesocket(sd);
  /* windows specifik */
  WSACleanup();
  return 0;
}
Avatar billede quiw Nybegynder
04. september 2005 - 13:22 #22
Genialt.. :D Det virker jo som det skal :) Må jeg sende dig point ?
Avatar billede arne_v Ekspert
04. september 2005 - 13:27 #23
så ligger jeg et svar
Avatar billede quiw Nybegynder
04. september 2005 - 18:48 #24
Såen.. Tror du fik dem.. :)
Avatar billede arne_v Ekspert
04. september 2005 - 18:49 #25
jep
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester