0

Is there any way where I can modify the original server code so that it accepts any port number instead of the predefined one (i.e., port number 8989)? The Port number will be entered in the command line when testing the Server1.exe as follows: start server 8989 (also the main function parameters holds the port the command line arguments) I tried doing it like as shown below, but when I went to my command prompt to run my server, it gave me:

Server1.c:7:23: fatal error: sys/socket.h: No such file or directory #include<sys/socket.h> as well as "compilation terminated"

    #include<io.h>
    #include<stdio.h>
    #include<winsock2.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<sys/un.h>
    #include<string.h>
    #include<netdb.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<string.h>
    //#define MY_PORT       8989
    #define MAXBUF      256
    
    int main(int argc , char *argv[])
    {
        WSADATA wsa;
        SOCKET sockfd , clientfd;
            struct sockaddr_in self;
            char buffer[MAXBUF], buffer1[MAXBUF]; //modified
    
        printf("\nInitialising Winsock...");
        if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
        {
            printf("Failed. Error Code : %d",WSAGetLastError());
            return 1;
        }
    
        printf("Initialised.\n");
    
        /*---create streaming socket---*/
        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
        {
            perror("Socket");
            exit(errno);
        }
    
            printf("Socket created.\n");
    
        /*---initialize address/port structure---*/
        /* bzero(&self, sizeof(self));*/
        self.sin_family = AF_INET;
        self.sin_port = htons(12000);     // Host to Network Short (16-bit)
        self.sin_addr.s_addr = INADDR_ANY;
        self.sin_addr.s_addr = inet_addr("172.20.10.2");
    
        /*---assign a port number to the socket---*/
        if ( bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0 )
        {
            perror("socket--bind");
            exit(errno);
        }
    
            puts("Bind done");
    
        /*---make it a "listening socket"---*/
        if ( listen(sockfd, 20) != 0 )
        {
            perror("socket--listen");
            exit(errno);
        }
    
            puts("Waiting for incoming connections...");
    
            char *ip;
    
        /*---forever... ---*/
        while (1)
        {
            struct sockaddr_in client_addr;
            int addrlen=sizeof(client_addr);
    
            /*---accept a connection (creating a data pipe)---*/
            clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
            printf("Connection Established\n");
            char ip[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, &(client_addr.sin_addr), ip, INET_ADDSTRLEN);
    
            // "ntohs(peer_addr.sin_port)" function is
            // for finding port number of client
            printf("connection established with IP : %s and PORT : %d\n", ip, ntohs(peer_addr.sin_port));
            recv(clientfd, buffer1, 256, 0);
            printf("Client : %s\n", buffer);
            strcpy(buffer, "Hello");
            send(clientfd, buffer, recv(clientfd, buffer, MAXBUF, 0), 0);
    
            /*---close connection---*/
            close(clientfd);
        }
          
        /*---clean up (should never get here!)---*/
        close(sockfd);
            WSACleanup();
        return 0;
    }
  • 2
    Before thinking about modifications to the program you have to solve the problem that you cannot compile it. Did you write the source code? Or where did you get it from? Based on `#include` and several things with `WSA`... I assume you want to build this program for native Windows. I think using both `#include ` and `#include` is wrong. Depending on the the build platform (native Windows, Cygwin, MinGW) you need different include files. see https://stackoverflow.com/q/2952733/10622916 – Bodo Dec 08 '21 at 14:28
  • regarding: `strcpy(buffer, "Hello"); send(clientfd, buffer, recv(clientfd, buffer, MAXBUF, 0), 0);` what ever the code placed into `buffer[]` will be overlayed via the `recv()`command. is this what you want? – user3629249 Dec 08 '21 at 22:20

0 Answers0