2017-10-24 1 views
-1

Ich muss zwei Zeichenfolgen in einem Client eingeben und sie mit einer Struktur an den Server senden. Dann tut der Server c = a + b und sendet eine Nachrichtenstruktur mit { a, b, c } an den Client. Wenn a oder b empfangen quit ist, sendet der Server zum Client bye.Senden und Empfangen einer Struktur über TCP

Client empfängt die Struktur und druckt c. Wenn es bye ist, schließt es die Verbindung, sonst kehrt es zu der Eingabe von a und b zurück und der Zyklus beginnt erneut.

Auftraggeber:

#if defined WIN32 
    #include <Winsock2.h> 
    #else 
    #define closesocket close 
    #include <sys/socket.h> 
    #include <arpa/inet.h> 
    #include <unistd.h> 
    #endif 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 

    #define BUFSIZE 30 

    void ClearWinSock() { 
    #if defined WIN32 
     WSACleanup(); 
    #endif 
    } 

    //-----------------------------INIZIALIZZAZIONE WSADATA 

    int main (void) { 
    #if defined WIN32 

     WSADATA wsaData; 
     int iResult = WSAStartup (MAKEWORD (2,2), &wsaData); 

     if (iResult !=0) { 
      printf ("error at WSASturtup\n"); 
      return 0; 
      } 

    #endif 

    //--------------------------------CREAZIONE SOCKET 

     int Csocket; 

     Csocket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); 

     if (Csocket < 0) { 

     printf ("socket creation failed"); 
     closesocket (Csocket); 
     ClearWinSock(); 
     return 0; 
     } 

     char s_address[BUFSIZE]; 
       printf ("Inserisci l'indirizzo dell'host a cui connetterti\n"); 
       scanf ("%s", s_address); 

       int port; 
       printf ("Inserisci la porta a cui connetterti\n"); 
       scanf("%d", &port); 

       struct sockaddr_in sad; 
        memset (&sad, 0, sizeof(sad)); 
        sad.sin_family = AF_INET; 
        sad.sin_addr.s_addr = inet_addr(s_address); 
        sad.sin_port = htons (port); 

    //------------------------------CONNESSIONE AL SERVER 

     if (connect(Csocket, (struct sockaddr*) &sad, sizeof(sad)) < 0) { 
      printf ("failed to connect\n"); 
      closesocket (Csocket); 
      ClearWinSock(); 
      return 0; 
     } 

    //-----------------------------RICEZIONE STRINGA DAL SERVER 

     char buf[BUFSIZE]; 

     int read = recv (Csocket, buf, BUFSIZE - 1, 0); 

     if (read <=0) { 

     printf ("Qualcosa non và!\n"); 
     } 

     else { 
     buf[read] = '\0'; //tappo stringa per sicurezza 
     printf("Server scrive: %s\n", buf); 
     } 


    //------------------------------STRUTTURA DI STRINGHE 

     struct stringab { 
           char a[30]; 
           char b[30]; 
           char c[70]; 
          } ab; 


          void* abptr = &ab; 


       printf ("Inserisci prima stringa\n"); 
       scanf ("%s", ab.a); 


          printf ("Inserisci seconda stringa\n"); 
          scanf ("%s", ab.b); 



     if (send(Csocket, (char*)abptr, sizeof(ab), 0) != sizeof(ab)) { 
       printf("client-send() sent a different number of bytes than expected"); 
       closesocket(Csocket); 
       ClearWinSock(); 
       system ("pause"); 
       return 0; 
      } 

printf ("\n"); 
    closesocket (Csocket); 
    system ("pause"); 
    ClearWinSock(); 
    return 0; 

    } 

Server:

#if defined WIN32 
#include <Winsock2.h> 
#else 
#define closesocket close 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#endif 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define BUFSIZE 30 

void ClearWinSock() { 
#if defined WIN32 
    WSACleanup(); 
#endif 
} 

int main(void) { 

//---------------------------INIZIALIZZAZIONE WSADATA 

#if defined WIN32 

    WSADATA wsaData; 
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
    if (iResult != 0) { 
     printf ("Error at WSAStartup"); 
     return 0; 
    } 

#endif 

//-------------------------------CREAZIONE SOCKET 

    int Mysocket; 
    Mysocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

    //Valutare la presenza di errori per assicurarsi che la socket sia valida. 
    if (Mysocket < 0) { 
     printf("socket creation failed\n"); 
     return 0; 
    } 

    //Assegnazione indirizzo alla socket. 
    struct sockaddr_in sad; 
    memset(&sad, 0, sizeof(sad)); 
    sad.sin_family = AF_INET; 
    sad.sin_addr.s_addr = inet_addr ("127.0.0.1"); 
    sad.sin_port = htons (9888); 

//------------------------ASSEGNAZIONE PORTA E IP ALLA SOCKET 

if (bind(Mysocket, (struct sockaddr*) &sad, sizeof(sad)) < 0) { 
    printf ("bind() failed\n"); 
    closesocket(Mysocket); 
    return 0; 
} 

//---------------------------SETTAGGIO SOCKET ALL'ASCOLTO 

int qlen = 10; //numero client che il server può gestire 

if (listen (Mysocket, qlen) < 0) { 

    printf("listen() failed\n"); 
    closesocket(Mysocket); 
    return 0; 
} 

struct sockaddr_in cad; // struttura per l'indirizzo del cient 
int Csocket;    // descrittore socket per il client 
int clientlen;   // lunghezza indirizzo del client 

//------------------------------ACCETTA LA CONNESSIONE 

while (1) { 

    printf("In attesa di un client con cui comunicare...\n"); 
    memset(&cad, 0, sizeof(cad)); 
    clientlen = sizeof(cad);  // assegna la dimensione dell'indirizzo del client 

    if((Csocket = accept(Mysocket, (struct sockaddr*) &cad, &clientlen)) < 0) { 
     printf ("accept failed\n"); 
     closesocket(Mysocket); 
     ClearWinSock(); 
     return 0; 
    } 


    printf("Connessione stabilita con il client il cui indirizzo e' %s \n\n", inet_ntoa(cad.sin_addr)); 

//---------------------------------------INVIO STRINGA AL CLIENT 

    char* inputString = "Connessione avvenuta!"; 
    int stringlen = strlen(inputString); 


    if (send(Csocket, inputString, stringlen, 0) != stringlen) { 
     printf("client-send() sent a different number of bytes than expected"); 
     closesocket(Csocket); 
     ClearWinSock(); 
     system ("pause"); 
     return 0; 
    } 

printf ("\n"); 
closesocket (Csocket); 
system ("pause"); 
ClearWinSock(); 
return 0; 

} 

So habe ich die Struktur auf dem Server auf diese Weise senden? Wie könnte der Server recv() diese Struktur und tun c = a + b Wiederaufbau und erneutes Senden der Struktur?

+1

Haben Sie beim Senden Fehler bekommen? Haben Sie die Struktur auf der anderen Seite erhalten? Können Sie das Problem, das Sie haben, näher erläutern? Und bitte [lesen Sie, wie Sie gute Fragen stellen können] (http://stackoverflow.com/help/how-to-ask) und erfahren Sie, wie Sie ein [minimales, vollständiges und verifizierbares Beispiel] erstellen können (http: // stackoverflow .com/hilfe/mcve). Sie sollten wahrscheinlich auch lesen [Wie kleine Programme zu debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) von Eric Lippert. –

+2

Von Thema (denke ich): Seien Sie vorsichtig beim Senden von Strukturen über das Netzwerk auf diese Weise. Wenn der Client und der Server unterschiedliche Typen sind, ihre Programme von verschiedenen Compilern usw. kompiliert werden, kann dies sehr schief gehen. In den meisten Fällen möchten Sie zumindest eine gepackte Struktur, um ein anderes Layout zu vermeiden. – 4386427

+0

Ich startete den Code und die Eingabe von zwei Strings funktioniert. Es scheint keinen Fehler auf der Sendeseite zu geben; aber ich weiß nicht, wie man die Struktur auf der Serverseite erhält, also weiß ich nicht, ob es ohne Probleme empfängt. – mark

Antwort

0

löste ich das Problem auf Sendeseite und Empfangsseite wie folgt aus:

send(Csocket, (char*)abptr, sizeof(ab), 0); 

recv (Csocket, (char*)abptr, sizeof(ab), 0); 

So habe ich die Struktur mit einer Struktur Zeiger auf beiden Seiten. Ich denke, es ist eine gute Lösung im lokalen Hosting, vielleicht brauchen Sie eine bessere für das Internet (Sicherheitsgründe).

Verwandte Themen