socket中connect连接失败

一个简单的TCP流程,socket客户端的connect为什么怎么总链接失败啊,不明白为啥,下面是源码

客户端:
int main(int argc, char** argv)
{
    int sockfd;
    int n;
    char recvline[4096],sendline[4096];
    struct sockaddr_in addr;
#if 0
    if(argc != 2){
        printf("usage:./clent<ipaddres>\n");
        return -1;
    }
   #endif
    if(sockfd = socket(AF_INET,SOCK_STREAM,0) < 0){
        printf("socket created failed.\n");
        return -1;
    }

    memset(&addr, 0, sizeof(addr));
    addr.sin_port = htons(4094);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if(connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
        printf("connect failed.\n");
        return -1;
    }
    printf("send msg to server:\n");

    fgets(sendline, 4096, stdin);

    if(send(sockfd, sendline, strlen(sendline), 0) < 0){

        printf("send server msg error:%s(error:%d)",strerror(errno),errno);
        return -1;
    }
    close(sockfd);
    return 0;
}

服务器端

int main(int argc, const char *argv[])
{
    int serverfd;
    int connfd;
    int n;
    char buff[4096];

    serverfd = socket(AF_INET,SOCK_STREAM,0);
    if(serverfd < 0){
        printf("Socket created failed.\n");
        return -1;
    }

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(4094);

    if(bind(serverfd,(struct sockaddr*)&addr, sizeof(addr)) < 0){
        printf("bind failed,\n");
        return -1;
    }

    if(listen(serverfd, 10) < 0){
        printf("listened failed.\n");
        return -1;
    }

    printf("======waiting for clent's request========\n");

   while(1){
        if((connfd = accept(serverfd, (struct sockaddr*)NULL, NULL)) < 0){
            printf("accept failed,\n");
            return -1;
        }
        n = recv(connfd, buff, 4096, 0);
        buff[n] = '\0';

        printf("recv from clent: %s\n",buff);
        close(connfd);
   }

   close(serverfd);
}

我查看端口是属于监听状态

img

img

抱歉抱歉我写错了,我客户端的sockfd赋值的时候没加()。抱歉,麻烦大家了.

以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
根据源码,我的分析如下:

  1. 首先要确认服务器端程序启动并监听指定端口(4094)。如果服务器端程序未启动或未监听该端口,连接必然失败。
  2. 检查目标IP地址是否正确。客户端使用的是127.0.0.1(回环地址),如果想连接真实服务器,IP需要修改为服务器的实际IP。
  3. 确认防火墙是否开放4094端口。如果防火墙屏蔽了4094端口,连接会失败。需要开放4094端口才能实现socket连接。
  4. 客户端调用connect方法前使用setReuseAddress方法重用地址。代码中未调用setReuseAddress方法,可能会存在端口被占用的情况,导致连接失败。
  5. 多线程环境下对sockfd加锁。如果多个线程同时调用sockfd的connect方法,很可能产生连接失败问题。需要加锁保证同一时间只有一个线程连接。
  6. 检查操作系统的最大文件打开数。如果系统参数maxfiles太小,会影响创建socket的数量,进而导致连接失败。需要适当增加maxfiles参数的值。
  7. 检查网络连接是否正常。网络连接出现故障也会导致socket连接失败。使用ping命令检查网络是否正常。

综上,连接失败的原因可能是:服务器端程序未启动、目标IP地址错误、防火墙阻止、端口被占用、多线程问题、系统最大文件数限制、网络连接故障等。我建议按以上检查步骤进行排查,定位并解决导致连接失败的根本原因。

serverfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
不要写0,0是IP协议

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/760233
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:TCP详解_基于socket实现TCP客户端服务互
  • 除此之外, 这篇博客: 网络------利用socket编程实现简单的TCP网络程序中的 什么是socket 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 之前我们在谈论进程间通信的时候,说到过一种实现进程间通信的机制,就是socket套接字,那么socket到底是什么呢?
    来看看百度百科的解释:
    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对socket。socket本质是编程接口(API)

    在网络中我们利用IP地址+端口号来表示网络中的唯一一个进程,所以IP地址+端口号就称为socket