通过TCP

时间:2017-10-24 15:36:39

标签: c tcp

我必须在客户端中键入两个字符串,并将结构发送到服务器。然后服务器执行c = a + b并向客户端发送带有{ a, b, c }的新闻结构。如果收到的abquit,则服务器会发送给客户bye

客户端收到结构并打印c。如果它是bye它会关闭连接,否则它会返回询问ab的输入,并且循环再次开始。

客户端:

    #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;

   }

服务器:

#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;

}

那么,我是否以这种方式将结构发送到服务器?服务器如何recv()这个结构并c = a + b重新构建并重新发送结构?

1 个答案:

答案 0 :(得分:0)

我解决了发送端和接收端的问题,如下所示:

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

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

所以我传递了结构,两边都有一个结构指针。我认为这是本地托管的一个很好的解决方案,也许你需要一个更好的网络(安全原因)。