服务器客户端程序绑定功能问题

发布于 2025-02-02 20:05:18 字数 3974 浏览 3 评论 0原文

我正在实现服务器客户端程序,其中两个端口用户都定义 在服务器端,用户将使用命令行界面插入服务器端口号,

在客户端端用户将插入客户端端口ID,然后随后使用服务端口ID。

很长一段时间以来,我发现我的服务器客户端程序出了什么问题。不过,问题是具有约束力,但我尝试了任何可能的方法来实施它。

server.c

  #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<netdb.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<string.h>
    #include<strings.h>
    
    void error(char *msg){
        perror(msg);
        exit(1);
    }
    
    int main(int argc, char *argv[]){
        int sockfd, newsockfd, 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);
        }
    
        bzero((char *) &serv_addr, sizeof(serv_addr));
    
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(atoi(argv[1]));
    
        if ((bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) != 0) {
            printf("socket bind failed...\n");
            exit(0);
        }
    
        listen(sockfd, 5);
    
        while(1){
            clilen = sizeof(cli_addr);
    
            newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
    
            if(newsockfd < 0){
                error("ERROR  on accept");
                exit(1);
            }
            printf("New client connected  from port no %d and IP %s\n", ntohs(cli_addr.sin_port), inet_ntoa(cli_addr.sin_addr));
            
            bzero(buffer, 256);
            n = read(newsockfd, buffer, 255);
    
            if(n < 0){
                error("ERROR reading from socket");
                exit(1);
            }
        }
        
        printf("Here is the message: %s \n",buffer);
        n = write(newsockfd, "I got your message", 18);
        if(n < 0){
            error("ERROR writing from socket");
             exit(1);
        }
    
         return (0);
    }

client.c

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

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

int main(int argc, char *argv[]){
    int sockfd, n;
    struct sockaddr_in serv_addr;

    char buffer[256];

    if(argc < 3){
        fprintf(stderr,"usage %s hostname port\n",argv[0]);
        exit(0);
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if(sockfd < 0){
        error("ERROR opening socket");
        exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[2]));
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

    if(connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0){
        error("ERROR connecting");
        exit(1);
    }

    printf("Please enter the message: ");
    bzero(buffer, 256);
    fgets(buffer, 256, stdin);

    n = write(sockfd, buffer, strlen(buffer));

    if(n < 0){
        error("ERROR writing to socket");
        exit(1);
    }

    bzero(buffer, 256);
    n = read(sockfd, buffer, 255);

    if(n < 0){
        error("ERROR reading from socket");
        exit(1);
    }

    printf("%s\n",buffer);

    return (0);
}

终端在其中运行

服务器正在运行的终端。

I am implementing server client program where the both the ports user define
in server side user will insert server port number using command line interface

in client side user will insert client port id and then followed by serve port id.

I got stuck for a long time finding out what is wrong with my server client program. The issue is in binding though but I tried whatever possible way to implement it.

Server.c

  #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<netdb.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<string.h>
    #include<strings.h>
    
    void error(char *msg){
        perror(msg);
        exit(1);
    }
    
    int main(int argc, char *argv[]){
        int sockfd, newsockfd, 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);
        }
    
        bzero((char *) &serv_addr, sizeof(serv_addr));
    
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(atoi(argv[1]));
    
        if ((bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) != 0) {
            printf("socket bind failed...\n");
            exit(0);
        }
    
        listen(sockfd, 5);
    
        while(1){
            clilen = sizeof(cli_addr);
    
            newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
    
            if(newsockfd < 0){
                error("ERROR  on accept");
                exit(1);
            }
            printf("New client connected  from port no %d and IP %s\n", ntohs(cli_addr.sin_port), inet_ntoa(cli_addr.sin_addr));
            
            bzero(buffer, 256);
            n = read(newsockfd, buffer, 255);
    
            if(n < 0){
                error("ERROR reading from socket");
                exit(1);
            }
        }
        
        printf("Here is the message: %s \n",buffer);
        n = write(newsockfd, "I got your message", 18);
        if(n < 0){
            error("ERROR writing from socket");
             exit(1);
        }
    
         return (0);
    }

Client.c

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

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

int main(int argc, char *argv[]){
    int sockfd, n;
    struct sockaddr_in serv_addr;

    char buffer[256];

    if(argc < 3){
        fprintf(stderr,"usage %s hostname port\n",argv[0]);
        exit(0);
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if(sockfd < 0){
        error("ERROR opening socket");
        exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[2]));
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

    if(connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0){
        error("ERROR connecting");
        exit(1);
    }

    printf("Please enter the message: ");
    bzero(buffer, 256);
    fgets(buffer, 256, stdin);

    n = write(sockfd, buffer, strlen(buffer));

    if(n < 0){
        error("ERROR writing to socket");
        exit(1);
    }

    bzero(buffer, 256);
    n = read(sockfd, buffer, 255);

    if(n < 0){
        error("ERROR reading from socket");
        exit(1);
    }

    printf("%s\n",buffer);

    return (0);
}

Terminal where client is running
enter image description here

Terminal where server is running.
enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橪书 2025-02-09 20:05:18

服务器永远不会创建 socket sockfd是一个不可传统的,不确定的值,当时传递给bind

调整编译器的警告级别可能已经提醒您:

server.c:36:14: warning: ‘sockfd’ may be used uninitialized [-Wmaybe-uninitialized]
   36 |         if ((bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) != 0) {
      |             ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在尝试绑定之前获取有效的文件描述符。

if (-1 == (sockfd = socket(...)) {
    perror("socket");
    return 1;
}

考虑使用 getAddrinfo 建立您的插座。人页面以及 > 有各种例子。

此外,响应客户端的代码

printf("Here is the message: %s \n",buffer);
n = write(newsockfd, "I got your message", 18);
if(n < 0){
    error("ERROR writing from socket");
    exit(1);
}

是处理传入连接的循环的。

The server never creates a socket. sockfd is an uninitialized, indeterminate value when passed to bind.

Turning up your compiler's warning level may have alerted you to this:

server.c:36:14: warning: ‘sockfd’ may be used uninitialized [-Wmaybe-uninitialized]
   36 |         if ((bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) != 0) {
      |             ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Obtain a valid file descriptor before trying to bind.

if (-1 == (sockfd = socket(...)) {
    perror("socket");
    return 1;
}

Consider the use of getaddrinfo to establish your sockets. The man page as well as Beej's Guide to Network Programming have various examples.

Additionally, the code that responds to the client

printf("Here is the message: %s \n",buffer);
n = write(newsockfd, "I got your message", 18);
if(n < 0){
    error("ERROR writing from socket");
    exit(1);
}

is outside of the loop that handles incoming connections.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文