LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   Can anyone please help to make server.c for non-blocking I/O for TCP socket programming? (https://www.linuxquestions.org/questions/programming-9/can-anyone-please-help-to-make-server-c-for-non-blocking-i-o-for-tcp-socket-programming-4175735911/)

cola 04-11-2024 10:47 AM

Can anyone please help to make server.c for non-blocking I/O for TCP socket programming?
 
Can anyone please help to make server.c for non-blocking I/O for TCP socket programming? I am trying to make multiple clients to connect to this server. I have tried the following code:
Code:

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h> // read(), write(), close()
#include <arpa/inet.h>
#include <fcntl.h>
#define MAX 80
#define PORT 8080
#define SA struct sockaddr

void func(int connfd)
{
        char buff[MAX];
        int n;
        // infinite loop for chat
        for (;;) {
                bzero(buff, MAX);

                // read the message from client and copy it in buffer
                read(connfd, buff, sizeof(buff));
                // print buffer which contains the client contents
                printf("From client: %s\t To client : ", buff);
                bzero(buff, MAX);
                n = 0;
                // copy server message in the buffer
                while ((buff[n++] = getchar()) != '\n')
                        ;

                // and send that buffer to client
                write(connfd, buff, sizeof(buff));

                // if msg contains "Exit" then server exit and chat ended.
                if (strncmp("exit", buff, 4) == 0) {
                        printf("Server Exit...\n");
                        break;
                }
        }
}

// Driver function
int main()
{
        int sockfd, connfd;
    socklen_t len;
        struct sockaddr_in servaddr, cli;

        // socket create and verification
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd == -1) {
                printf("socket creation failed...\n");
                exit(0);
        }
        else
                printf("Socket successfully created..\n");
       
       
        int flags = fcntl(sockfd, F_GETFL, 0);
        flags |= O_NONBLOCK;
        int status = fcntl(sockfd, F_SETFL, flags);
        //printf("status: %d\n", status);

        bzero(&servaddr, sizeof(servaddr));

        // assign IP, PORT
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    //servaddr.sin_addr.s_addr = inet_addr("192.168.1.103");
        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...\n");
                exit(0);
        }
        else
                printf("Socket successfully binded..\n");

        // Now server is ready to listen and verification
        if ((listen(sockfd, 5)) != 0) {
                printf("Listen failed...\n");
                exit(0);
        }
        else
                printf("Server listening..\n");
        len = sizeof(cli);

        while(1) {
                // Accept the data packet from client and verification
                connfd = accept(sockfd, (SA*)&cli, &len);
                if (connfd < 0) {
                        printf("server accept failed...\n");
                        exit(0);
                }
                else
                        printf("server accept the client...\n");

                // Function for chatting between client and server
                func(connfd);
        }
        close(sockfd);
}

I have got the output like this:
Code:

Socket successfully created..
Socket successfully binded..
Server listening..
server accept failed...


NevemTeve 04-11-2024 11:02 AM

Print `errno` and `strerror(errno)`.

teckk 04-11-2024 04:01 PM

The best I can tell you need to change this...,
Code:

connfd = accept(sockfd, (SA*)&cli, &len);
Instead of me trying to rewrite this, here, a working example, you rewrite it.
Code:

//gcc BindPort.c -o BindPort

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg) {
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;
   
    if (argc < 2) {
        fprintf(stderr,"ERROR, no port provided\n");
        exit(1);
    }
   
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
   
    if (sockfd < 0)
        error("ERROR opening socket");
       
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);
   
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("ERROR on binding");
       
    listen(sockfd,5);
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
   
    if (newsockfd < 0)
        error("ERROR on accept");
       
    bzero(buffer,256);
    n = read(newsockfd,buffer,255);
   
    if (n < 0)
        error("ERROR reading from socket");
       
    printf("Here is the message: %s\n",buffer);
    n = write(newsockfd,"I got your message",18);
   
    if (n < 0) error("ERROR writing to socket");
        close(newsockfd);
       
    close(sockfd);
    return 0;
}

Compiled, ran executable, Opened a web browser to http://127.0.0.1:8100/

Code:

gcc BindPort.c -o BindPort

./BindPort 8100

Here is the message: GET / HTTP/1.1
Host: 127.0.0.1:8100
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/123.0.6312.52 Mobile/15E148 Safari/604.1



All times are GMT -5. The time now is 02:13 AM.