Jack_sama 2021-07-17 22:37 采纳率: 100%
浏览 91
已采纳

socket编程互联一直出现connect error

在centos中进行一个传输文件的客户端和服务端编写连接时一直error
来,上代码,这是服务端file_server.c的

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define BUF 30
void error_handling(char *message);

int main(int argc,char *argv[]){
        int serv_sd,clnt_sd;
        FILE *fp;
        char buf[BUF];
        int read_cnt;
        struct sockaddr_in serv_addr,clnt_addr;
        socklen_t clnt_addr_size;
        if(argc!=2){
                printf("Usage: %s <port>\n",argv[0]);
                exit(1);
        }
        fp = fopen("file.server.c","rb");
        serv_sd=socket(PF_INET, SOCK_STREAM, 0);
        if(serv_sd==-1)
                error_handling("socket() error.");
        memset(&serv_addr, 0, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_addr.sin_port=htons(atoi(argv[1]));

        if(bind(serv_sd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
                error_handling("bind() error.");
        if(listen(serv_sd, 5)==-1)
                error_handling("listen() error.");
        clnt_addr_size = sizeof(clnt_addr);
        clnt_sd=accept(serv_sd,(struct sockaddr*)&clnt_addr, &clnt_addr_size);
        if(clnt_sd==-1)
                error_handling("accept() error.");
        while(1){
                read_cnt=fread((void*)buf, 1, BUF, fp);
                if(read_cnt < BUF){
                        write(clnt_sd, buf, read_cnt);
                        break;
                }
                write(clnt_sd, buf, BUF);
        }
        shutdown(clnt_sd, SHUT_WR);
        read(clnt_sd, buf, BUF);
        printf("客户端:%s\n",buf);
        fclose(fp);
        close(clnt_sd);close(serv_sd);
        return 0;
}

void error_handling(char *message){
        fputs(message,stderr);
        fputc('\n',stderr);
        exit(1);
}

客户端file_client.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define BUF 30
void error_handling(char *message);

int main(int argc,char *argv[]){
    int sock;
    FILE *fp;
    char buf[BUF];
    int read_cnt;
    struct sockaddr_in serv_addr;
    if(argc!=3){
        printf("Usage: %s <IP> <port>",argv[0]);
        exit(1);
    }
    sock = socket(PF_INET, SOCK_STREAM,0);
    if(sock==-1)
        error_handling("socket() error.");
    fp=fopen("file_client.c","wb");
    if(fp == NULL){
        printf("无法打开file_client.c");
        exit(1);
    }
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_addr.sin_port = (atoi(argv[2]));

    if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
        error_handling("connect() error.");
    while((read_cnt=read(sock, buf, BUF))!=0)
        fwrite((void*)buf, 1, read_cnt, fp);
    puts("客户端:");
    write(sock, "Thank you.", 10);
    fclose(fp);
    close(sock);
    return 0;
}

void error_handling(char *message){
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}

然后在我以centos服务器为服务端,然后win10为客户端连接时,依然是connect error,命令方面仔细检查是没有问题的。win10客户端file_client.c代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#define BUF 30
void ErrorHandling(char *message);

int main(int argc,char *argv[]){
    WSADATA wsaData;
    SOCKET hSocket;
    FILE *fp;
    char buf[BUF];
    int readCnt;
    SOCKADDR_IN servAddr;

    if(argc!=3){
        printf("Usage: %s <IP> <port>",argv[0]);
        exit(1);
    }
    if(WSAStartup(MAKEWORD(2,2), &wsaData)!=0)
        ErrorHandling("WSAStartup() error.");
    fp = fopen("test.dat","wb");
    if(fp==NULL){
        printf("无法打开test.dat文件");
        exit(1);
    }
    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if(hSocket == INVALID_SOCKET)
        ErrorHandling("socket() error.");
    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr(argv[1]);
    servAddr.sin_port = (atoi(argv[2]));

    if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR)
        ErrorHandling("connect() error.");
    while((readCnt=recv(hSocket, buf, BUF,0))!=0)
        fwrite((void*)buf, 1, readCnt, fp);

    puts("客户端");
    send(hSocket, "Thank you.", 10, 0);
    fclose(fp);
    closesocket(hSocket);
    WSACleanup();
    return 0;
}
void ErrorHandling(char *message){
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}

依然是connect() error,另外,服务器防火墙是关闭了的。

  • 写回答

2条回答 默认 最新

  • 水墨长天 2021-07-18 02:21
    关注

    服务端的主函数:

    int main(int argc,char *argv[]){
            int serv_sd,clnt_sd;
            FILE *fp;
            char buf[BUF] = {0};
            int read_cnt;
            struct sockaddr_in serv_addr,clnt_addr;
            socklen_t clnt_addr_size;
            if(argc!=2){
                    printf("Usage: %s <port>\n",argv[0]);
                    exit(1);
            }
            fp = fopen("file.server.c","rb");
            serv_sd=socket(PF_INET, SOCK_STREAM, 0);
            if(serv_sd==-1)
                    error_handling("socket() error.");
            memset(&serv_addr, 0, sizeof(serv_addr));
            serv_addr.sin_family = AF_INET;
            serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
            serv_addr.sin_port=htons(atoi(argv[1]));
            if(bind(serv_sd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
            {
                close(serv_sd);
                error_handling("bind() error.");
            }        
            if(listen(serv_sd, 5)==-1)
            {
                close(serv_sd);
                error_handling("listen() error.");
            }
            clnt_addr_size = sizeof(clnt_addr);
            clnt_sd=accept(serv_sd,(struct sockaddr*)&clnt_addr, &clnt_addr_size);
            if(clnt_sd==-1)
                    error_handling("accept() error.");
            while(1)
            {
                read_cnt = read(clnt_sd, (void*)buf, BUF);
                if(read_cnt == -1 ){
                    continue;
                }
                write(clnt_sd, buf, BUF);
                printf("客户端:%s\n",buf);
                memset(buf,0x00,BUF);
                usleep(100);
            }
            printf("结束");
            close(clnt_sd);
            close(serv_sd);
            return 0;
    }
    

    客户端主函数:

    #include <fcntl.h>
    
    int main(int argc,char *argv[]){
        int sock;
        int fd;
        char buf[BUF];
        int read_cnt;
        struct sockaddr_in serv_addr;
        if(argc!=3){
            printf("Usage: %s <IP> <port>",argv[0]);
            exit(1);
        }
        sock = socket(PF_INET, SOCK_STREAM,0);
        if(sock==-1)
            error_handling("socket() error.");
        fd=open("file_client.c",O_RDWR);
        if(fd == -1){
            printf("无法打开file_client.c");
            exit(1);
        }
        memset(&serv_addr, 0, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
        serv_addr.sin_port = htons(atoi(argv[2]));
        if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
            error_handling("connect() error.");
        while((read_cnt=read(fd, buf, BUF))!=0)
        {
            if(read_cnt==-1)
                continue;
            write(sock, (void*)buf, BUF);
            usleep(100);
        }
        getchar();
        puts("客户端:");
        write(sock, "Thank you.", 10);
        close(sock);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 7月19日
  • 创建了问题 7月17日

悬赏问题

  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测