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

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

服务端

#include 
#include 
#include 
#include 
#include 
#include 
#include 


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 
#include 
#include 
#include 
#include 
#include 
#include 

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;
}

检查客户端与服务器之间的网络连接是否正常。可以使用 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;
}


```

看你这里是一个TCP的客户端和服务器通讯的程序,你从以下几个方面来排查问题:
1、首先确定你的服务器的ip地址是否是:128.24.190.248;
2、确认下你这里的服务器程序与客户端程序,哪个软件先运行(注意:正确的应该是先运行服务器,再运行客户端);
3、服务器的程序里应该是有问题的,以当前代码来看,每次接收数据必须先建立连接;而你的客户端程序实际上只会建立一次连接。因此服务器和客户端的程序不匹配。
如有问题,可以私聊!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^