雪傲天1 2023-05-21 18:54 采纳率: 96.2%
浏览 16
已结题

请问我的client 程序为什么总是报错,报的是10061的错误,如果不运行server程序,只运行client,也会报10061错误,为什么呢

//以下程序名为client
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
int  SendtoServ(const char* mypath)
{
#if 1
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    char sendBuff[1000]{};
    wVersionRequested = MAKEWORD(2, 2);
    // 初始化套接字库
    err = WSAStartup(wVersionRequested, &wsaData);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        return err;
    }
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        WSACleanup();
        system("pause");
        return -1;
    }
#endif
    printf("fun sentoserv\n");
    SOCKET sockClie = socket(AF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == sockClie)
    {
        printf("socket errorNum = %d\n", GetLastError());
        system("pause");
        return -1;
    }
    //配置要连接的服务器
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);
    //连接服务器
    if (SOCKET_ERROR == connect(sockClie, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR )))
    {
        printf("connect errorNum = %d\n", GetLastError());
        system("pause");
        return -1;
    }
    //读取文件内容
    FILE* fp = fopen(mypath, "rb");
    int len = fread(sendBuff, 1, 100, fp);
    // 发数据 
    int iLen = send(sockClie, (char*)sendBuff, 100, 0);
    if (iLen<0)
    {
        printf("send error:%d", GetLastError());
        system("pause");
        return -1;
    }
    //关闭socket
    closesocket(sockClie);
    WSACleanup();
    return 0;
}
int  getFile(const char* filepath)
{
    //WIN32_FIND_DATA是一个结构体,可用来表示文件
    WIN32_FIND_DATA FindFileData;
    //文件、键盘、鼠标等都是通过句柄来标识
    HANDLE hListFile;
    //首先找到第一个文件,调用API findfirstfile,
    //MAX_PATH系统定义的一个宏,表示260
    char szFilePath[MAX_PATH]{};
    //strcpy字符串复制函数,strcat截断函数
    strcpy( szFilePath,filepath );
    strcat(szFilePath, "\\*");
    hListFile=FindFirstFile(szFilePath, &FindFileData);

    //循环遍历所有文件,如果FindNextFile返回值为0,即找不到下个文件,退出循环
    do 
    {
        char mypath[MAX_PATH]{};
        strcpy(mypath, filepath);
        strcat(mypath, FindFileData.cFileName);
        if (strstr(mypath,".pdf"))
        {
            SendtoServ(mypath);
            printf("mypath==%s\n", mypath);
        }
    } while (FindNextFile(hListFile, &FindFileData));

    return 0;
}
int main()
{
    //定义一个函数,用来遍历未见
    getFile("C:\\Users\\zozoz\\Desktop\\笔记");
    system("pause");
    return 0;
}
//以下程序名为server
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
#define  MAX_SIZE  100000
//写一个错误函数,打印错误码的控制台函数,打印后,直接退出
void errorhanding(const char* msg)
{
    fputs(msg, stderr);//stderr和getlasterror差不多,都是错误码
    fputc('\n', stderr);
    system("pause");
    exit(1);

}
int main()
{
#if 1
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    char MSG[MAX_SIZE]{0};
    wVersionRequested = MAKEWORD(2, 2);
    // 初始化套接字库
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        errorhanding("WSAStartup error");
        system("pause");
    }
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("LOBYTE error:  %d\n", GetLastError());
        WSACleanup();
        errorhanding("LOBYTE error");
        system("pause");
        return -1;
    }
#endif
    SOCKET servsock =socket(PF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET== servsock)
    {
        errorhanding("servsock error");
    }


    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);
    // 3 分配电话号码
    // 绑定套接字到本地 IP 地址,端口号 6000
    if (SOCKET_ERROR == bind(servsock, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR )))
    {
        errorhanding("bind  error");
    }
    // 4、监听 listen
    if (SOCKET_ERROR == listen(servsock, 5))
    {
        errorhanding("listen  error");
    }
    // 5、拿起话筒,准备通话
    SOCKADDR_IN addrCli;
    int len = sizeof(SOCKADDR_IN);
    int strlen{};
    SOCKET cliesock;
    for (int i=0;i<1000;i++)
    {
        cliesock = accept(servsock, (SOCKADDR*)&addrCli, &len);
        if (SOCKET_ERROR == cliesock)
        {
            errorhanding("accept  error");
        }
        memset(MSG, 0, MAX_SIZE);
        while ((strlen=recv(cliesock,MSG,MAX_SIZE,0))!=0)
        {
            printf("Server msg=%s\n", MSG);
        }
        closesocket(cliesock);
    }
    closesocket(servsock);
    WSACleanup();
    return 0;
}

请问我的client 程序为什么总是报错,报的是10061的错误,如果不运行server程序,只运行client,也会报10061错误,为什么呢

  • 写回答

2条回答 默认 最新

  • 技术宅program 2023-05-21 19:07
    关注

    以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

    这个错误是因为client程序试图连接server,但server没有启动导致的。

    client程序运行时,会尝试连接到localhost(127.0.0.1)的6000端口。但是如果server程序没有运行,6000端口没有开启,导致client无法连接,产生10061错误。

    10061错误是连接失败错误,表示远程主机 aktivley 拒绝了连接。

    所以,出现这个错误的原因有两种:

    1. server程序没有运行,6000端口没有开启,client无法连接。
    2. server程序运行了,但6000端口由于某些原因关闭或拒绝连接,client无法连接。

    根据你的描述,是第一种原因导致的错误,也即只运行了client程序,server程序没有启动。

    解决方案很简单,只需要同时启动server和client程序。server程序启动后会开启6000端口,client就可以成功连接。

    所以,要解决这个错误,你需要:

    1. 同时启动server和client程序。
    2. 检查防火墙等是否屏蔽了6000端口,如果屏蔽了需要打开。
    3. server程序启动后,检查是否正确开启了6000端口,使用netstat -an | grep 6000命令检查。
    4. 如果重复出现此错误,还需要检查网络连接是否正常等。

    简而言之,这个错误是网络连接类错误,解决的关键在于确保client和server能够正常连接和通信。大部分情况下只需要同时启动两端程序并检查防火墙设置就可以解决。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月29日
  • 已采纳回答 5月21日
  • 创建了问题 5月21日