c - 服务器套接字第一次没有收到消息。为什么会出现这种情况?

标签 c sockets

我遇到了一个奇怪的情况。我正在创建一个简单的回显客户端服务器。客户端能够向服务器发送消息。 accept 调用在服务器中成功,但由于某种原因,它第一次没有检测到客户端消息。但是当客户端第二次发送消息时,服务器能够检测到该消息并打印它。

这是我接受客户端连接的服务器片段。

while(1) {
    // continuously listen for the new client-requests
    int client_fd = accept(server_fd, (struct sockaddr*)&client,&client_socklen);
    if(client_fd > 0) {
     char b[10];
     while(1) {

      ssize_t response = recv(client_fd,b, 10, 0);
      if(response == 0) {printf("reached end of stream"); break;}
      if(response == -1) {printf("error"); break;}

     }

     fprintf("%s", b);

    }
}

当客户端第一次发送请求时,对 accept 的调用成功,控件进入 if block ,但在那里它没有接收消息,只是打印 到达流末尾。但是当客户端再次发送消息时,它会收到消息并打印出来。为什么会出现这种情况?客户端正在发送一条简单的 echo! 消息。

客户端片段:

    #include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>

#define SERVER_ADDR "localhost"
#define SERVER_PORT 8889


int main(int argc, char **argv) {

    int socket_fd = 0;
    struct sockaddr_in server_socket_addr;

    // Converts localhost into 0.0.0.0
    struct hostent *he = gethostbyname(SERVER_ADDR);
    unsigned long server_addr_nbo = *(unsigned long *)(he->h_addr_list[0]);

    // Create socket (IPv4, stream-based, protocol likely set to TCP)
    if (0 > (socket_fd = socket(AF_INET, SOCK_STREAM, 0))) {
        fprintf(stderr, "client failed to create socket\n");
        exit(1);
    }

    bzero(&server_socket_addr, sizeof(server_socket_addr));
    server_socket_addr.sin_family = AF_INET;
    server_socket_addr.sin_port = htons(SERVER_PORT);
    server_socket_addr.sin_addr.s_addr = server_addr_nbo;

    // Connect socket to server
    if (0 > connect(socket_fd, (struct sockaddr *)&server_socket_addr, sizeof(server_socket_addr))) {
        fprintf(stderr, "client failed to connect to %s:%d!\n", SERVER_ADDR, SERVER_PORT);
        close(socket_fd);
        //          exit(1);
    } else {
        fprintf(stdout, "client connected to to %s:%d!\n", SERVER_ADDR, SERVER_PORT);
        char *my_message = "hey!!"
        int bytes_sent = send(socket_fd, my_message, strlen(my_message), 0);
    }

    // Close the socket and return
    close(socket_fd);
    return 0;
}

最佳答案

而不是这个:

if(client_fd > 0) {
     char b[10];
     while(1) {

      ssize_t response = recv(client_fd,b, 10, 0);
      if(response == 0) {printf("reached end of stream"); break;}
      if(response == -1) {printf("error"); break;}

     }

     fprintf("%s", b);

这个:

if(client_fd > 0) {
     const size_t BUFFER_SIZE = 10;
     char b[BUFFER_SIZE+1];  // +1 for null termination
     while(1) {
      b[0] = '\0';
      ssize_t response = recv(client_fd,b, BUFFER_SIZE, 0);
      if(response == 0) {printf("reached end of stream"); break;}
      if(response == -1) {printf("error"); break;}
      b[response] = '\0';
      printf("%s\n", b);  //  \n so that the message will flush to the console
     }

关于c - 服务器套接字第一次没有收到消息。为什么会出现这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59747115/

相关文章:

c++ - 点对点实际上如何在网络/端口方面工作?

java - 使用 Java 是否需要创建套接字来获取远程主机 IP?

python - 从同一个套接字读取 tcp 和 udp 数据包

c - 函数 '_fsopen' 不适用于写入文件。 C

不使用标准库的十六进制 C 代码

c - 删除字符串中的一个字符?

python - 为什么我的网络在传递数据之前要等到套接字或 websocket 连接关闭

node.js - 无法在express和socket.io之间共享套接字 session

c - 写入/dev/mem 失败,地址错误

c - 如何在 Ubuntu 上解决错误消息 "gcc‬: command not found"(仅带参数)