一个达布刘(o゚v゚)ノ 2023-04-03 17:32 采纳率: 43.8%
浏览 33

Linux下socket编程客户端服务端通信问题

Linux环境下socket编程,客户端服务端均已建立,但是就是通信不了,运行客户端please enter根本出不来
附上代码,大家帮忙看看,困扰许久

服务端

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <iostream>


int main(){
    int listen_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(listen_sockfd < 0){
        perror("socket");
        return 0;
    }
   
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(38989); 
    addr.sin_addr.s_addr = inet_addr("0.0.0.0"); /* 0.0.0.0: 表示当前机器当中的任意一块网卡地址 */
    int ret = bind(listen_sockfd, (struct sockaddr*)&addr, sizeof(addr));
    if(ret < 0){
        perror("bind");
        return 0;
    }
    
    ret = listen(listen_sockfd, 1);
    if(ret < 0){
        perror("listen");
        return 0;
    }
    while(1){
        int new_sockfd = accept(listen_sockfd, NULL, NULL);
        if(new_sockfd < 0){
            perror("accept");
            return 0;
        }

        char buf[1024] = {0};
        ssize_t recv_size = recv(new_sockfd, buf, sizeof(buf) - 1, 0);
        if(recv_size < 0){
            perror("recv");
            return 0;
        }else if(recv_size == 0){
            close(new_sockfd);
            return 0;
        }else{
            printf("client say: %s\n", buf);
        }

        memset(buf, '\0', 1024);
        printf("please enter: ");
        fflush(stdout);

        std::cin >> buf;
        send(new_sockfd, buf, strlen(buf), 0);
    }

    close(listen_sockfd);
    return 0;
}

客户端

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>

int main(){
  
    int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sockfd < 0){
        perror("socket");
        return 0;
    }

    struct sockaddr_in svr_addr;
    svr_addr.sin_family = AF_INET;
    svr_addr.sin_port = htons(38989);
    svr_addr.sin_addr.s_addr = inet_addr("128.24.190.248");
    int ret = connect(sockfd, (struct sockaddr*)&svr_addr, sizeof(svr_addr));
    if(ret < 0){
        perror("connect");
        return 0;
    }
    while(1){
     
        char buf[1024] = {0};
        printf("please enter: ");
        fflush(stdout);

        std::cin >> buf;
       
        send(sockfd, buf, strlen(buf), 0);

        memset(buf, '\0', 1024);

        ssize_t recv_size  = recv(sockfd, buf, sizeof(buf) - 1, 0);
        if(recv_size < 0){
            perror("recv");
        }else if(recv_size == 0){
            close(sockfd);
            return 0;
        }else{
            printf("server say: %s\n", buf);
        }
        sleep(1);
    }


    close(sockfd);
    return 0;
}
  • 写回答

3条回答 默认 最新

  • lmr廖 2023-04-03 17:44
    关注

    检查客户端与服务器之间的网络连接是否正常。可以使用 ping 命令测试两台计算机之间的连通性。

    检查客户端和服务器程序中的 IP 地址、端口号等参数是否正确,并且保证两者的设置相同。

    确认服务器程序已经正确启动,并且正在监听指定的端口。可以使用 netstat 命令查看服务器程序是否在指定的端口上监听连接。

    如果服务器程序运行于虚拟机内部,需要将虚拟机的网络适配器设置为桥接模式,以便让外部计算机能够连通虚拟机内部的 IP 地址。

    检查客户端和服务器程序中的代码是否有错误,例如发送/���收数据时是否出现了类型不匹配、缓冲区溢出等问题。

    可以考虑在客户端程序中添加调试输出语句,以便快速定位问题所在

    以下是一个简单的 Linux 环境下基于 socket 的客户端服务端通信代码:

    服务器端代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <string.h>
    
    #define PORT 8080
    
    int main() {
        int server_fd, new_socket;
        struct sockaddr_in address;
        int addrlen = sizeof(address);
        char buffer[1024] = {0};
        const char *hello = "Hello from server";
    
        // 创建 socket 文件描述符
        if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
            perror("socket failed");
            exit(EXIT_FAILURE);
        }
    
        // 设置服务器地址和端口号
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = INADDR_ANY;
        address.sin_port = htons(PORT);
    
        // 绑定 socket 到指定的地址和端口号上
        if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
            perror("bind failed");
            exit(EXIT_FAILURE);
        }
    
        // 监听连接请求
        if (listen(server_fd, 3) < 0) {
            perror("listen");
            exit(EXIT_FAILURE);
        }
    
        printf("Waiting for client connection...\n");
    
        // 接受连接请求,创建新的 socket 文件描述符
        if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
            perror("accept");
            exit(EXIT_FAILURE);
        }
    
        printf("Client connected successfully!\n");
    
        // 从客户端接收数据,并回复消息
        while(1) {
            memset(buffer, 0, sizeof(buffer));
            if (recv(new_socket, buffer, 1024, 0) < 0) {
                perror("recv");
                exit(EXIT_FAILURE);
            }
            printf("Message from client: %s\n", buffer);
    
            send(new_socket , hello , strlen(hello) , 0 );
            printf("Hello message sent to client!\n");
        }
    
        return 0;
    }
    客户端代码:
    
    ```c
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    
    #define PORT 8080
    
    int main(int argc, char const *argv[]) {
        int sock = 0, valread;
        struct sockaddr_in serv_addr;
        char buffer[1024] = {0};
        const char *hello = "Hello from client";
    
        // 创建 socket 文件描述符
        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
            printf("\n Socket creation error \n");
            return -1;
        }
    
        memset(&serv_addr, '0', sizeof(serv_addr));
    
        // 设置服务器地址和端口号
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(PORT);
    
        // 将 IPv4 地址从文本转换为二进制格式
        if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
            printf("\nInvalid address/ Address not supported \n");
            return -1;
        }
    
        // 连接服务器
        if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
            printf("\nConnection Failed \n");
            return -1;
        }
    
        // 发送消息到服务器
        send(sock , hello , strlen(hello) , 0 );
        printf("Hello message sent to server!\n");
    
        // 从服务器接收消息并显示
        if ((valread = read( sock , buffer, 1024)) < 0) {
            printf("\nRead error \n");
        }
        printf("Message from server: %s\n", buffer );
    
        return 0;
    }
    
    
    

    ```

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月3日