Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Compatibilità Client/Server

    Su piattaforma Windows ho scritto un client ed un server in C. Il server rimane in ascolto e riceve la stringa che manda il client. Ho testato il tutto sul mio Pc e tutto funziona.

    Poi ho scitto la stessa cosa in VC++ li ho testati e funzionano.

    Se volessi far interagire il Server scitto in C con il client in VC++ che accorgimenti dovrei avere?
    Pensavo che il server scritto in C (una volta messo in ascolto) sarebbe stato in grado di accettare la connessione dal client scritto in VC++.
    La porta è la stessa, cosa dovrei controllare?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Nulla.

    Pero' non capisco se effettivamente hai un problema ...

  3. #3
    Il problema è che sebbene il server sia attivo, il client nn riesce a connettersi.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non lo avevi detto esplicitamente.

    Quando dici "scritto in C", con quale compilatore intendi?

    Hai degli errori?

    Ci mostri il codice?

  5. #5
    Ho appena provato col Telnet

    telnet 127.0.0.1 4000

    si connette.

    Può dipendere dalle versioni di winsock?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Puo' dipendere da mille cose.

    Ma se non mostri il codice, come faccio a risponderti?

  7. #7

    Codice Server

    // SERVER

    #include <stdio.h>
    #include <windows.h>
    #include <winsock.h>

    #define PORT 4000
    #define LBUF 10


    SOCKET sock;

    SOCKADDR addr;

    void MsgProc();

    void main()

    {

    printf("Questo server accetta 5 connessioni sulla porta %d\n",PORT);


    // INIZIALIZZO LA STRUTTURA INDICANDO PROTOCOLLO E IP SU DOVE ESEGUIRE
    SOCKADDR_IN addr_in;
    addr_in.sin_family=AF_INET;
    addr_in.sin_port=PORT;
    addr_in.sin_addr.S_un.S_un_b.s_b1=127;
    addr_in.sin_addr.S_un.S_un_b.s_b2=0;
    addr_in.sin_addr.S_un.S_un_b.s_b3=0;
    addr_in.sin_addr.S_un.S_un_b.s_b4=1;

    memcpy(&addr,&addr_in,sizeof(SOCKADDR_IN));

    SOCKET temp=NULL;

    // INIZIALIZZO I WINSOCKETS

    WSADATA dat;
    WORD ver=MAKEWORD(1,1);
    int res;

    printf("WSAStartup: %d Version %d\n",(res=WSAStartup(ver,&dat)),ver);

    if(res!=0)
    return;


    // SETTO LA CONNESSIONE
    sock=socket(PF_INET,SOCK_STREAM,0);

    printf("Binding socket: %d\n",bind(sock,&addr,sizeof(addr)));
    printf("Listen mode: %d\n",listen(sock,5));

    //qui entra in ballo quello temporaneo
    while((temp=accept(sock,&addr,NULL))==SOCKET_ERROR );

    sock=temp; //passo temp al socket creato inizialmente

    if(sock)
    MsgProc();

    WSACleanup();
    }


    void MsgProc()
    {
    char buf[10];
    int res=1;
    while((res=recv(sock,buf,LBUF,0))!=SOCKET_ERROR)
    {
    if(res==0||res==WSAECONNRESET||res==WSAECONNABORTE D)
    {
    printf("Client terminated connection\n");
    break;
    }

    _flushall();//probably not needed

    printf("Recieved string: %s\n",buf);

    send(sock,buf,LBUF,0);
    }

    closesocket(sock);
    }



    // CLIENT

    #include <stdio.h>
    #include <windows.h>
    #include <winsock.h>
    #include <process.h>

    #define PORT 4000
    #define LSTRING 10

    SOCKET sock=NULL;

    SOCKADDR addr;

    void MsgProc();

    void main()
    {
    WSADATA dat;
    WORD ver=MAKEWORD(2,2);

    int res;
    SOCKADDR_IN addr_in;
    addr_in.sin_family=AF_INET;
    addr_in.sin_port=PORT;
    addr_in.sin_addr.S_un.S_un_b.s_b1=127;
    addr_in.sin_addr.S_un.S_un_b.s_b2=0;
    addr_in.sin_addr.S_un.S_un_b.s_b3=0;
    addr_in.sin_addr.S_un.S_un_b.s_b4=1;

    memcpy(&addr,&addr_in,sizeof(SOCKADDR_IN));


    printf("Remember, 0s are good\n");

    printf("WSAStartup: %d. Version %d\n",(res=WSAStartup(ver,&dat)),ver);

    if(res!=0)
    return;

    sock=socket(PF_INET,SOCK_STREAM,0);

    printf("Connect: %d\n",(res=connect(sock,&addr,sizeof(addr))));

    if(sock==NULL||res!=0)
    return;

    MsgProc();

    WSACleanup();
    }


    void MsgProc()
    {
    char str[LSTRING]="";
    int res;

    while(stricmp(str,"exit")!=0){
    printf("String to send: ");
    gets(str);

    send(sock,str,LSTRING,0);

    for(int i=0;(res=recv(sock,str,LSTRING,0))==SOCKET_ERROR&& i<50;i++)
    Sleep(100);

    if(res==0||res==WSAECONNRESET||res==WSAECONNABORTE D)
    {
    printf("Server terminated connection\n");
    break;
    }


    }

    closesocket(sock);

    }


    questi il server ed il Client, questi funzionano

  8. #8
    Scusa se so un pò casinista, cmq tra le varie prove...
    ho attivato il server, ma il telnet nn si collega
    Immagini allegate Immagini allegate

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Tu tenti di connetterti alla porta 4000 ma scrivi

    addr_in.sin_port=100;

    (che non vuol dire ne' che usi la porta 100 ne' che usi la porta 4000).

    Devi scrivere

    addr_in.sin_port=htons(4000);

    per la porta 4000

    Non ho esaminato il resto del codice ...

  10. #10
    E' vero! ecco perchè funzionavano lo stesso, perchè senza conversione, chissà che valore prendeva, ma era lo stesso.
    OK grazie adesso funziona o per lo meno riescono a stabilire una connessione.
    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.