zoukankan      html  css  js  c++  java
  • TCP/UDP Server-Client implementation in C

    TCP Server-Client implementation in C

    Prerequisites – Socket Programming in C/C++, TCP and UDP server using select, UDP Server-Client implementation in C
    If we are creating a connection between client and server using TCP then it has few functionality like, TCP is suited for applications that require high reliability, and transmission time is relatively less critical. It is used by other protocols like HTTP, HTTPs, FTP, SMTP, Telnet. TCP rearranges data packets in the order specified. There is absolute guarantee that the data transferred remains intact and arrives in the same order in which it was sent. TCP does Flow Control and requires three packets to set up a socket connection, before any user data can be sent. TCP handles reliability and congestion control. It also does error checking and error recovery. Erroneous packets are retransmitted from the source to the destination.

    The entire process can be broken down into following steps:

    The entire process can be broken down into following steps:

    TCP Server –

    1. using create(), Create TCP socket.
    2. using bind(), Bind the socket to server address.
    3. using listen(), put the server socket in a passive mode, where it waits for the client to approach the server to make a connection
    4. using accept(), At this point, connection is established between client and server, and they are ready to transfer data.
    5. Go back to Step 3.

    TCP Client –

    1. Create TCP socket.
    2. connect newly created client socket to server.

    TCP Server:

    #include <stdio.h> 
    #include <netdb.h> 
    #include <netinet/in.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <sys/socket.h> 
    #include <sys/types.h> 
    #define MAX 80 
    #define PORT 8080 
    #define SA struct sockaddr 
      
    // Function designed for chat between client and server. 
    void func(int sockfd) 
    { 
        char buff[MAX]; 
        int n; 
        // infinite loop for chat 
        for (;;) { 
            bzero(buff, MAX); 
      
            // read the message from client and copy it in buffer 
            read(sockfd, buff, sizeof(buff)); 
            // print buffer which contains the client contents 
            printf("From client: %s	 To client : ", buff); 
            bzero(buff, MAX); 
            n = 0; 
            // copy server message in the buffer 
            while ((buff[n++] = getchar()) != '
    ') 
                ; 
      
            // and send that buffer to client 
            write(sockfd, buff, sizeof(buff)); 
      
            // if msg contains "Exit" then server exit and chat ended. 
            if (strncmp("exit", buff, 4) == 0) { 
                printf("Server Exit...
    "); 
                break; 
            } 
        } 
    } 
      
    // Driver function 
    int main() 
    { 
        int sockfd, connfd, len; 
        struct sockaddr_in servaddr, cli; 
      
        // socket create and verification 
        sockfd = socket(AF_INET, SOCK_STREAM, 0); 
        if (sockfd == -1) { 
            printf("socket creation failed...
    "); 
            exit(0); 
        } 
        else
            printf("Socket successfully created..
    "); 
        bzero(&servaddr, sizeof(servaddr)); 
      
        // assign IP, PORT 
        servaddr.sin_family = AF_INET; 
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
        servaddr.sin_port = htons(PORT); 
      
        // Binding newly created socket to given IP and verification 
        if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) { 
            printf("socket bind failed...
    "); 
            exit(0); 
        } 
        else
            printf("Socket successfully binded..
    "); 
      
        // Now server is ready to listen and verification 
        if ((listen(sockfd, 5)) != 0) { 
            printf("Listen failed...
    "); 
            exit(0); 
        } 
        else
            printf("Server listening..
    "); 
        len = sizeof(cli); 
      
        // Accept the data packet from client and verification 
        connfd = accept(sockfd, (SA*)&cli, &len); 
        if (connfd < 0) { 
            printf("server acccept failed...
    "); 
            exit(0); 
        } 
        else
            printf("server acccept the client...
    "); 
      
        // Function for chatting between client and server 
        func(connfd); 
      
        // After chatting close the socket 
        close(sockfd); 
    } 

    TCP Client:

    #include <netdb.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <sys/socket.h> 
    #define MAX 80 
    #define PORT 8080 
    #define SA struct sockaddr 
    void func(int sockfd) 
    { 
        char buff[MAX]; 
        int n; 
        for (;;) { 
            bzero(buff, sizeof(buff)); 
            printf("Enter the string : "); 
            n = 0; 
            while ((buff[n++] = getchar()) != '
    ') 
                ; 
            write(sockfd, buff, sizeof(buff)); 
            bzero(buff, sizeof(buff)); 
            read(sockfd, buff, sizeof(buff)); 
            printf("From Server : %s", buff); 
            if ((strncmp(buff, "exit", 4)) == 0) { 
                printf("Client Exit...
    "); 
                break; 
            } 
        } 
    } 
      
    int main() 
    { 
        int sockfd, connfd; 
        struct sockaddr_in servaddr, cli; 
      
        // socket create and varification 
        sockfd = socket(AF_INET, SOCK_STREAM, 0); 
        if (sockfd == -1) { 
            printf("socket creation failed...
    "); 
            exit(0); 
        } 
        else
            printf("Socket successfully created..
    "); 
        bzero(&servaddr, sizeof(servaddr)); 
      
        // assign IP, PORT 
        servaddr.sin_family = AF_INET; 
        servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
        servaddr.sin_port = htons(PORT); 
      
        // connect the client socket to server socket 
        if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) != 0) { 
            printf("connection with the server failed...
    "); 
            exit(0); 
        } 
        else
            printf("connected to the server..
    "); 
      
        // function for chat 
        func(sockfd); 
      
        // close the socket 
        close(sockfd); 
    } 

    Compilation –
    Server side:
    gcc server.c -o server
    ./server

    Client side:
    gcc client.c -o client
    ./client

    Output –
    Server side:

    Socket successfully created..
    Socket successfully binded..
    Server listening..
    server acccept the client...
    From client: hi
         To client : hello
    From client: exit
         To client : exit
    Server Exit... 

    Client side:

    Socket successfully created..
    connected to the server..
    Enter the string : hi
    From Server : hello
    Enter the string : exit
    From Server : exit
    Client Exit... 


    UDP Server-Client implementation in C

    There are two major transport layer protocols to communicate between hosts : TCP and UDP. Creating TCP Server/Client was discussed in a previous post.

    Prerequisite : Creating TCP Server/Client

    Theory
    In UDP, the client does not form a connection with the server like in TCP and instead just sends a datagram. Similarly, the server need not accept a connection and just waits for datagrams to arrive. Datagrams upon arrival contain the address of sender which the server uses to send data to the correct client.
    UDP Client/Server function calls

    The entire process can be broken down into following steps :
    UDP Server :

    1. Create UDP socket.
    2. Bind the socket to server address.
    3. Wait until datagram packet arrives from client.
    4. Process the datagram packet and send a reply to client.
    5. Go back to Step 3.

    UDP Client :

    1. Create UDP socket.
    2. Send message to server.
    3. Wait until response from server is recieved.
    4. Process reply and go back to step 2, if necessary.
    5. Close socket descriptor and exit.

    Necessary Functions :

    int socket(int domain, int type, int protocol)
    Creates an unbound socket in the specified domain.
    Returns socket file descriptor.
    

    Arguments :
    domain – Specifies the communication
    domain ( AF_INET for IPv4/ AF_INET6 for IPv6 )
    type – Type of socket to be created
    ( SOCK_STREAM for TCP / SOCK_DGRAM for UDP )
    protocol – Protocol to be used by socket.
    0 means use default protocol for the address family.

    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
    Assigns address to the unbound socket.
    

    Arguments :
    sockfd – File descriptor of socket to be binded
    addr – Structure in which address to be binded to is specified
    addrlen – Size of addr structure

    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                   const struct sockaddr *dest_addr, socklen_t addrlen)
    Send a message on the socket
    

    Arguments :
    sockfd – File descriptor of socket
    buf – Application buffer containing the data to be sent
    len – Size of buf application buffer
    flags – Bitwise OR of flags to modify socket behaviour
    dest_addr – Structure containing address of destination
    addrlen – Size of dest_addr structure

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                     struct sockaddr *src_addr, socklen_t *addrlen)
    Receive a message from the socket.
    

    Arguments :
    sockfd – File descriptor of socket
    buf – Application buffer in which to receive data
    len – Size of buf application buffer
    flags – Bitwise OR of flags to modify socket behaviour
    src_addr – Structure containing source address is returned
    addrlen – Variable in which size of src_addr structure is returned

    int close(int fd)
    Close a file descriptor
    

    Arguments :
    fd – File descriptor

    In the below code, exchange of one hello message between server and client is shown to demonstrate the model.

    UDPServer.c

    // Server side implementation of UDP client-server model 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <string.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 
    #include <arpa/inet.h> 
    #include <netinet/in.h> 
    
    #define PORT     8080 
    #define MAXLINE 1024 
    
    // Driver code 
    int main() { 
        int sockfd; 
        char buffer[MAXLINE]; 
        char *hello = "Hello from server"; 
        struct sockaddr_in servaddr, cliaddr; 
        
        // Creating socket file descriptor 
        if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { 
            perror("socket creation failed"); 
            exit(EXIT_FAILURE); 
        } 
        
        memset(&servaddr, 0, sizeof(servaddr)); 
        memset(&cliaddr, 0, sizeof(cliaddr)); 
        
        // Filling server information 
        servaddr.sin_family = AF_INET; // IPv4 
        servaddr.sin_addr.s_addr = INADDR_ANY; 
        servaddr.sin_port = htons(PORT); 
        
        // Bind the socket with the server address 
        if ( bind(sockfd, (const struct sockaddr *)&servaddr, 
                sizeof(servaddr)) < 0 ) 
        { 
            perror("bind failed"); 
            exit(EXIT_FAILURE); 
        } 
        
        int len, n; 
    
        len = sizeof(cliaddr); //len is value/resuslt 
    
        n = recvfrom(sockfd, (char *)buffer, MAXLINE, 
                    MSG_WAITALL, ( struct sockaddr *) &cliaddr, 
                    &len); 
        buffer[n] = ''; 
        printf("Client : %s
    ", buffer); 
        sendto(sockfd, (const char *)hello, strlen(hello), 
            MSG_CONFIRM, (const struct sockaddr *) &cliaddr, 
                len); 
        printf("Hello message sent.
    "); 
        
        return 0; 
    } 

    UDPClient.c

    // Client side implementation of UDP client-server model 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <string.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 
    #include <arpa/inet.h> 
    #include <netinet/in.h> 
    
    #define PORT     8080 
    #define MAXLINE 1024 
    
    // Driver code 
    int main() { 
        int sockfd; 
        char buffer[MAXLINE]; 
        char *hello = "Hello from client"; 
        struct sockaddr_in     servaddr; 
    
        // Creating socket file descriptor 
        if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { 
            perror("socket creation failed"); 
            exit(EXIT_FAILURE); 
        } 
    
        memset(&servaddr, 0, sizeof(servaddr)); 
        
        // Filling server information 
        servaddr.sin_family = AF_INET; 
        servaddr.sin_port = htons(PORT); 
        servaddr.sin_addr.s_addr = INADDR_ANY; 
        
        int n, len; 
        
        sendto(sockfd, (const char *)hello, strlen(hello), 
            MSG_CONFIRM, (const struct sockaddr *) &servaddr, 
                sizeof(servaddr)); 
        printf("Hello message sent.
    "); 
            
        n = recvfrom(sockfd, (char *)buffer, MAXLINE, 
                    MSG_WAITALL, (struct sockaddr *) &servaddr, 
                    &len); 
        buffer[n] = ''; 
        printf("Server : %s
    ", buffer); 
    
        close(sockfd); 
        return 0; 
    } 

    Output :

    $ ./server
    Client : Hello from client
    Hello message sent.
    
    $ ./client
    Hello message sent.
    Server : Hello from server
    


    Copyright
    https://www.geeksforgeeks.org/tcp-server-client-implementation-in-c/

  • 相关阅读:
    Photoshop 2021 for Mac
    viscose live serves 扩展工具更改默认自动打开的浏览器
    UML面向对象分析、建模与设计
    Shell 脚本
    早做打算,不要随遇而安。
    编程人员成长模型
    Spring AOP详解
    Mybatis逆向工程的配置
    Int和String互转的方法
    SQL学习
  • 原文地址:https://www.cnblogs.com/dong1/p/11897350.html
Copyright © 2011-2022 走看看