【问题标题】:client not connecting with server C (Socket programming)客户端未与服务器 C 连接(套接字编程)
【发布时间】:2023-07-14 01:21:01
【问题描述】:

我有一个非常简单的客户端和服务器代码:

客户

int sockfd = 0;
    int bytesReceived = 0;
    char recvBuff[BUFSIZE];
    memset(recvBuff, '0', sizeof(recvBuff));
    struct sockaddr_in serv_addr;
    printf("here i am\n");
    /* Create a socket first */
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0){
        printf("\n Error : Could not create socket \n");
        return 1;
    }
    fprintf(stderr, "connection stats\n");
    fprintf(stderr, "connecting to %d - %s \n",port,server);
    /* Initialize sockaddr_in data structure */
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port); // port
    serv_addr.sin_addr.s_addr = server;
    printf(" attempting connection %s:%d\n", server, port);
    /* Attempt a connection */
     int con =  connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
     printf("Error %d\n", con);
    exit(-1);

和服务器

   int listenfd = 0;
    int connfd = 0;
    struct sockaddr_in serv_addr;
    char sendBuff[BUFSIZE];
    int numrv;

    listenfd = socket(AF_INET, SOCK_STREAM, 0);

    printf("Socket retrieve success\n");

    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff));
    printf("here 2\n");
    serv_addr.sin_family = AF_INET;
    printf("here 3\n");
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    printf("here 4\n");
    serv_addr.sin_port = htons(port);
    printf("here 5\n");
    int optval = 1;
    printf(" opening port %d\n", port);
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,
               (const void *) &optval, sizeof(int));
    bind(listenfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    printf("binded\n");


    while (1) {
        connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);
        printf("connfd %d", connfd);


        close(connfd);
        sleep(1);


    }

客户端输出:

here i am
connecting to 8888 - localhost 
 attempting connection localhost:8888

服务器输出

Socket retrieve success
here 2
here 3
here 4
here 5
 opening port 8888
binded

在等待几分钟后.. 我观察到以下内容: 客户:

here i am
connecting to 8888 - localhost 
 attempting connection localhost:8888
Error -1

服务器:

Socket retrieve success
here 2
here 3
here 4
here 5
 opening port 8888
binded
connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd 

-1,我可以猜到连接失败了。 我不确定我错过了什么?

【问题讨论】:

  • 您应该在connfd %d 之后放置一个\n,否则printf 的输出将被缓冲,当它发生时您将看不到它。您也可以调用fflush 打印缓冲输出
  • @Eregrith:你是对的..所以基本上,连接立即失败..但我不确定..为什么服务器不接受客户端连接..
  • 看看errnoperror 可能会有所帮助,请与the connect() manual 交叉
  • 理论上connect应该阻塞,但这取决于你的环境。尝试不要立即退出客户端,而是发送一些数据并在循环中等待一段时间(100ms)。
  • @vbence 如果连接返回-1,您将无法发送一些数据。

标签: c sockets


【解决方案1】:

服务器在调用accept() 之前未在绑定的套接字上调用listen()


还有这个

serv_addr.sin_addr.s_addr = server;

应该由编译器发出警告。您不能将 C-“字符串”(我假设 server 是)分配给 in_addr_tserv_addr.sin_addr.s_addr 是)。

通过以下方式解决此问题:

serv_addr.sin_addr.s_addr = inet_addr(server);

或者更好地添加错误检查,像这样:

{
  in_addr_t in_addr = inet_addr(server);
  if (INADDR_NONE == in_addr)
  {
    perror("inet_addr() failed");
    abort(); /* or whatever error handling you choose. */
  }

  serv_addr.sin_addr.s_addr = in_addr;
}

【讨论】:

  • 是的..确实解决了..所以现在服务器正在等待传入的连接..但客户端无法连接到它..我的客户端代码上是否缺少任何内容?
  • 好的..所以我可以完成这项工作..而不是本地主机,如果我有 serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");那么它工作正常吗?但我实际上有字符串本地主机?有没有办法初始化 localhost.. 而不是 127.0.0.1
  • 我得到 PING localhost (127.0.0.1) 56(84) 字节的数据。来自本地主机(127.0.0.1)的 64 个字节:icmp_seq=1 ttl=64 时间=0.011 毫秒来自本地主机(127.0.0.1)的 64 个字节:icmp_seq=2 ttl=64 时间=0.018 毫秒但是当我使用 localhost 而不是 127.0.0.1 ,客户端连接失败(返回-1)
  • @Fraz:您需要通过getaddrinfo() 获取符号名称的 IP 地址。
最近更新 更多