DownsStirp 2025-01-20 18:31 采纳率: 0%
浏览 50

winsocket tcp error 10061:connect()函数失败,WSAGetLastError返回10061,如何解决?

在编写一个服务器和客户端程序时,在不同的机器上连接会提示10061错误,但是在同一个机器通过回环连接却不报错。
服务器代码:

#include"../TcpSocket/tcpSocket.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUF 1020000
int main(void) {
    init_Socket();
    SOCKET serfd = createServerSocket(NULL);
    FILE*fp, *fp1;
    long int j = 0, b;
wait:
    puts("wait for client");
    SOCKET clifd = accept(serfd, NULL, NULL);
    char acc_buffer[1024] = { 0 }, sysmes[BUF];
    if (INVALID_SOCKET == clifd)
        err("accept");
    puts("connected");
    //通信
    for (;;) {
        for (int i = 0; i < 1024; acc_buffer[i] = '\0', i++);
        for (long int i = 0; i < BUF; sysmes[i] = '\0', i++);
        if (0 < recv(clifd, acc_buffer, 1024, 0)) {
            
            if (!strcmp("\\exit", acc_buffer)) {
                puts("disconnected");
                goto wait;
            }
            else if (!strcmp("\\fcreate",acc_buffer)) {
                if (SOCKET_ERROR == send(clifd, "pls enter the name:", strlen("pls enter the name:"), 0)) {
                    err("send");
                    break;
                }
                for (int i = 0; i < 1024; acc_buffer[i] = '\0', i++);
                if (0 < recv(clifd, acc_buffer, 1024, 0)) {
                    if (!(fp1 = fopen(acc_buffer, "w+"))) {
                        if (SOCKET_ERROR == send(clifd, "cannot create it", strlen("cannot create it"), 0)) {
                            err("send");
                            break;
                        }
                        continue;
                    }
                }
            if (SOCKET_ERROR == send(clifd, "successfully,pls enter the text\n", strlen("successfully,pls enter the text\n"), 0)) {
                    err("send");
                    break;
                }
                for (int i = 0; i < 1024; acc_buffer[i] = '\0', i++);
                if ((0 < recv(clifd, acc_buffer, 1024, 0))&& fputs(acc_buffer, fp1)!=EOF) {
                    if (SOCKET_ERROR == send(clifd, "successfully\n", strlen("successfully\n"), 0)) {
                        err("send");
                        break;
                    }
                }
                fclose(fp1);
                continue;
            }
            printf("receive:%s\n", acc_buffer);
            //执行指令
            sprintf(sysmes, "%s > bin.log 2>&1", acc_buffer);
            system(sysmes);
            fp = fopen("bin.log", "a+");
            if (!fp||fseek(fp, 0L, SEEK_SET)) {
                fprintf(stderr, "cannot open file bin.log");
                return -1;
            }
            sprintf(sysmes, "------the server answer-------\n");
            for (j = strlen("------the server answer-------\n"); j < BUF&&(b=getc(fp))!=EOF;sysmes[j]=b,j++);
            sysmes[j] = '\0';
            if (SOCKET_ERROR == send(clifd, sysmes, strlen(sysmes), 0)) {
                err("send");
                break;
            }
            fclose(fp);
            remove("bin.log");
        }

    }
    //关闭
    closesocket(clifd);
    closesocket(serfd);
    close_Socket();
    puts("hit the enter key to exit");
    getchar(); 
    return 0;
}

客户端代码:

#include"../TcpSocket/tcpSocket.h"
#include<stdio.h>
#include<string.h>
#define BUF 1020000
int main(void) {
    init_Socket();
    char a[] = "127.0.0.1";
    puts("pls input the server's IP");
    scanf("%s", a);
    getchar();
    puts("connecting");
    SOCKET clifd = createClientSocket("127.0.0.1");
    char buffer[1024], receive[BUF];
    //send message
    for (;;) {
        input:
        for (int i = 0; i < 1024; buffer[i] = '\0', i++);
        for (int i = 0; i < BUF; receive[i] = '\0', i++);
        fputs("pls send message(\\exit to exit,\\fcreate to create file on server,enter to skip the input):", stdout);
        for (int a = 0, b = 0; (a = getchar()) != '\n'&&b < 1024; buffer[b]=a, b++);
        if (buffer[0] == '\0')
            goto input;

        if (!strcmp(buffer, "\\exit")) {
            if (SOCKET_ERROR == send(clifd,"\\exit", strlen("\\exit"), 0))
                err("exit");
            break;
        }
        if (SOCKET_ERROR == send(clifd, buffer, strlen(buffer), 0))
            err("send");
        receiv:
        if (0 < recv(clifd,receive, BUF, 0)) {
            if (!strcmp(receive, "pls enter the name:")) {
                puts(receive);
                for (int i = 0; i < 1024; buffer[i] = '\0', i++);
                for (int a= 0, b = 0;(a=getchar())!='\n'&&b < 1024; buffer[b] = a, b++);
                if (SOCKET_ERROR == send(clifd, buffer, strlen(buffer), 0))
                    err("send");
                for (int i = 0; i < 1024; buffer[i] = '\0', i++);
                for (int i = 0; i < BUF; receive[i] = '\0', i++);
                if (0 < recv(clifd, receive, BUF, 0)) {
                    fputs(receive,stdout);
                    puts("`to skip");
                    for (int a = 0, b = 0; (a = getchar()) != '`'&&b < 1024; buffer[b] = a, b++);
                    if (SOCKET_ERROR == send(clifd, buffer, strlen(buffer), 0))
                        err("send");
                }
                getchar();
                for (int i = 0; i < BUF; receive[i] = '\0', i++);
                goto receiv;

            }
            puts(receive);
        }
    }
    closesocket(clifd);
    close_Socket();
    puts("hit the enter key to exit");
    //getchar();
    getchar();
    return 0;
}

tcpSocket.c代码:

#include"tcpSocket.h"
#include<stdio.h>

//open the net lib
bool init_Socket() {
    WSADATA wsadata;
    //启动Windows异步套接字
    if (!WSAStartup(MAKEWORD(1, 1), &wsadata))
        return true;
    err("WSAStartup");
    return false;
}
//colse the net lib
bool close_Socket() {
    if (!WSACleanup())
        return true;
    err("WSACleanup");
    return false;
}
//create server socket
SOCKET createServerSocket(const char * ip) {
    //create empty socket
    SOCKET ServerSocket=socket(AF_INET/*<-IPV4 AF_INET6 <- IPV6*/, SOCK_STREAM  /*<-流式协议  SOCK_DGRAM<-报式协议  */ ,IPPROTO_TCP);//fuction1:af 地址协议族:ipv4&ipv6;fuction2:type 传输协议类型:流式&报式;fuction3:protocl 具体传输协议
    if (ServerSocket != INVALID_SOCKET) {
    //绑定端口&IP
        struct sockaddr_in addr = { AF_INET/*同创建一致*/,htons(PORT)/*本地字节序转换网络字节序*/};
        addr.sin_addr.S_un.S_addr = ip != NULL ? inet_addr(ip) : ADDR_ANY;
        if (SOCKET_ERROR == bind(ServerSocket,(struct sockaddr*)&addr, sizeof(addr))) {
            err("bind");
            return false;
        }
    //监听端口
        if (SOCKET_ERROR==listen(ServerSocket, 10)) {
            err("listen");
            return false;
        }
        return ServerSocket;
    }
    err("socket");
    return INVALID_SOCKET;
}
//create client socket
SOCKET createClientSocket(const char *ip) {
    SOCKET ClientSocket = socket(AF_INET/*<-IPV4 AF_INET6 <- IPV6*/, SOCK_STREAM  /*<-流式协议  SOCK_DGRAM<-报式协议  */, IPPROTO_TCP);//fuction1:af 地址协议族:ipv4&ipv6;fuction2:type 传输协议类型:流式&报式;fuction3:protocl 具体传输协议
    if (ClientSocket != INVALID_SOCKET) {
        //建立链接
        struct sockaddr_in addr = { AF_INET/*同创建一致*/,htons(PORT)/*本地字节序转换网络字节序*/ };
        addr.sin_addr.S_un.S_addr = inet_addr(ip);// < -指定IP ADDR_ANY <-任意IP
        if (INVALID_SOCKET==connect(ClientSocket, (struct sockaddr*)&addr, sizeof(addr))) {
            err("connect");
            return false;
        }
        return ClientSocket;
    }
    err("socket");
    return INVALID_SOCKET;
}

tcpSocket.h代码:

#ifndef _TCPSOCKET_H_
#define _TCPSOCKET_H_
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define err(x) fprintf(stderr, "[Line %d]%s failed,code:%d\n",__LINE__,x, WSAGetLastError())
#define PORT 62304
#include<stdbool.h>
//open the net lib
bool init_Socket();
//colse the net lib
bool close_Socket();
//create server socket
SOCKET createServerSocket(const char *);
//create client socket
SOCKET createClientSocket(const char *);
#endif

过程展示:
同一个机器测试:

img

不同机器测试(使用虚拟机,物理机同一个问题):

img

img

附录:文件排版

img

  • 写回答

4条回答 默认 最新

  • DownsStirp 2025-01-20 20:10
    关注

    已解决,无需回复

    评论

报告相同问题?

问题事件

  • 创建了问题 1月20日