cipisi 2024-07-27 14:07 采纳率: 77.8%
浏览 2

客户端连接不到服务器

客户端连接不到服务器

客户端

#include<winsock2.h>
#include<ws2tcpip.h>
#include<stdio.h>

#pragma comment(lib,"Ws2_32.lib")
#define DEFAULT_PORT "2701590"
#define DEFAULT_BUFLEN 512

int main(int argc,char**argv)
{
    //初始化winsock
    WSADATA wsadata;
    int text;
    text = WSAStartup(MAKEWORD(2, 2), &wsadata);
    if (text != 0)
    {
        printf("wsastartup失败%d\n", text);
        return 1;
    }

    //创建套接字
    addrinfo* result = NULL, * prt = NULL, hints;//保存主机地址信息
    ZeroMemory(&hints, sizeof(hints));
    text = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);//床底服务器名称的IP地址
    if (text != 0)
    {
        printf("getaddrinfo失败%d\n", text);
        WSACleanup();//关闭DLL
        return 1;
    }

    SOCKET Connectsocaet = INVALID_SOCKET;
    prt = result;
    //创建用于连接到服务器的 SOCKET
    Connectsocaet = socket(prt->ai_family, prt->ai_socktype, prt->ai_protocol);
    if (Connectsocaet == INVALID_SOCKET)
    {
        printf("socket错误%ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    text = connect(Connectsocaet, prt->ai_addr, (int)prt->ai_addrlen);
    if (text == SOCKET_ERROR)
    {
        closesocket(Connectsocaet);
        Connectsocaet = INVALID_SOCKET;
    }
    //如果失败打印错误信息
    freeaddrinfo(result);
    if (Connectsocaet == INVALID_SOCKET)
    {
        printf("无法连接到服务器\n");
        WSACleanup();
        return 1;
    }

    //在客户端上发送和接受数据
    int recvbuflen = DEFAULT_BUFLEN;
    const char* sendbuf = "this is a text";
    char recvbuf[DEFAULT_BUFLEN];
    //int iResult;
    //发送初始缓冲区
    text = send(Connectsocaet, sendbuf, (int)strlen(sendbuf), 0);
    if (text == SOCKET_ERROR)
    {
        printf("send失败%d\n", WSAGetLastError());
        closesocket(Connectsocaet);
        WSACleanup();
        return 1;
    }
    
    do
    {
        text = recv(Connectsocaet, recvbuf, recvbuflen, 0);//接收数据
        if (text > 0)
            printf("接受的字节数:%d\n", text);
        else if (text == 0)
            printf("连接已关闭\n");
        else
            printf("recv失败%d\n", WSAGetLastError());

    } while (text > 0);
    //断开客户端的链接
    text = shutdown(Connectsocaet, SD_SEND);
    if (text == SOCKET_ERROR)
    {
        printf("shutdown失败%D\n", WSAGetLastError());
        closesocket(Connectsocaet);
        WSACleanup();
        return 1;
    }

    //关闭套接字
    closesocket(Connectsocaet);
    WSACleanup();
    return 0;
}

服务器端

#include<winsock2.h>
#include<ws2tcpip.h>
#include<stdio.h>

#pragma comment(lib,"Ws2_32.lib")
#define DEFAULT_PORT "2701590"
#define DEFAULT_BUFLEN 512

int main()
{
    //初始化winsock
    WSADATA wsadata;
    int text;
    text = WSAStartup(MAKEWORD(2, 2), &wsadata);
    if (text != 0)
    {
        printf("失败%d\n", text);
        return 1;
    }

    //创建套接字
    addrinfo *result = NULL, * ptr = NULL, hints;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    //解析服务器要使用的本地地址和端口
    text = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (text != 0)
    {
        printf("getaddrinfo失败%d\n", text);
        WSACleanup();
        return 1;
    }
    //创建SOCKET对象,以侦听客户端连接
    SOCKET ListenSocket = INVALID_SOCKET;
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("socket失败%ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    // 设置 TCP 侦听套接字
    text = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    if (text == SOCKET_ERROR)
    {
        printf("bind失败%d\n", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    freeaddrinfo(result);
    //将套接字置于侦听传入连接的状态
    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
    {
        printf("listen错误%ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //接受套接字上的链接
    SOCKET ClientSocket;
    ClientSocket = INVALID_SOCKET;
    //接受客户端套接字
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("accept失败%d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //在套接字上接收和发送数据
    char recvbuf[DEFAULT_BUFLEN];
    int iResult, iSendResult;
    int recvbuflen = DEFAULT_BUFLEN;
    //接收,知道客户端关闭连接
    do
    {
        iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
        if (iResult > 0)
        {
            printf("接受到的字节数:%d\n", iResult);
            //将蝗虫去回显给发送方
            iSendResult = send(ClientSocket, recvbuf, recvbuflen, 0);
            if (iSendResult == SOCKET_ERROR)
            {
                printf("send 失败: %d\n", WSAGetLastError());
                closesocket(ClientSocket);
                WSACleanup();
                return 1;
            }
            printf("发送的字节数%d\n", iSendResult);
        }
        else if (iResult == 0)
            printf("链接正在关闭...\n");
        else
        {
            printf("连接失败%d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }
    } while (iResult > 0);

    //断开服务器连接

    //关闭连接的发送部分
    iResult = shutdown(ClientSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown失败: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }
    closesocket(ClientSocket);
    WSACleanup();
    return 0;
}

服务器端可以运行,但客户端connect连接不上 报错“无法连接到服务器”

  • 写回答

1条回答 默认 最新

  • 专家-司宇[在线] 2024-07-27 14:07
    关注

    引自免费微信小程序:皆我百晓生

    从你给出的代码来看,有几个可能导致客户端无法连接到服务器的问题。让我们一步步分析并解决这些问题。

    1. 服务器地址解析问题: 在客户端代码中,你使用 getaddrinfo() 函数解析服务器名称的 IP 地址。你需要确保你传递给 getaddrinfo() 的服务器名称是正确的,并且该服务器名称对应的 IP 地址是可以访问的。如果你使用的是一个本地服务器(如localhost),请确保服务器的监听地址是正确配置的。另外,还要确保服务器的端口号没有被防火墙阻止。
    2. 网络防火墙问题: 确保服务器的防火墙允许客户端连接到指定的端口。如果服务器运行在一个受保护的网络环境中,可能需要进行特定的配置才能允许外部连接。
    3. 客户端和服务器是否在同一个网络: 确保客户端和服务器位于同一个局域网或可以相互访问的网络中。尝试在客户端机器上ping服务器的IP地址来检查网络连接是否正常。
    4. 端口号问题: 检查服务器端和客户端使用的端口号是否匹配,并确保端口号没有被其他服务占用。在你的代码中,默认的端口号是 "2701590"
    5. 代码中的错误处理: 在你的代码中,错误处理的方式主要是打印错误信息并退出程序。你可以考虑在错误发生时添加更多的调试信息,以帮助确定问题的具体原因。例如,在 getaddrinfo()connect() 失败时打印更详细的错误信息。
    6. Winsock版本问题: 确保你的客户端和服务器都使用了相同版本的Winsock库,并且正确初始化了Winsock库。在你的代码中,你使用了 WSAStartup() 函数来初始化Winsock库,这是正确的做法。但是,还需要确保在你的环境中安装了正确的Winsock版本。

    根据这些指导原则检查你的代码和网络配置,希望这能帮助你解决问题。如果问题仍然存在,你可以提供更多详细的错误信息或调试输出,以便更准确地定位问题所在。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月27日
  • 创建了问题 7月27日