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,另外,服务器防火墙是关闭了的。

服务端的主函数:

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

换了端口后,发现同样的代码可以运行了,原来的9190端口在用strerror(errno)查看后发现连接被拒绝,换了端口就可以了。