服务器无法通过C中的套接字向客户端发送消息

用户名

嗨,我正在编写2个程序(服务器,客户端),它们应该通过套接字相互通信。客户端可以毫无问题地将其第一条消息发送到服务器,但是当服务器尝试应答时,客户端只收到一个空的味精:recv(...)为0。send(...)调用函数后,服务器突然停止这是我的代码:

服务器:

    /* Create a new TCP/IP socket `sockfd`, and set the SO_REUSEADDR
       option for this socket. Then bind the socket to localhost:portno,
       listen, and wait for new connections, which should be assigned to
       `connfd`. Terminate the program in case of an error.
    */
    struct sockaddr_in sin,
                    peer_addr;
    //-----gen socket-----//
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        bail_out(EXIT_PARITY_ERROR, "could not create Socket");

    //-----bind-----//
    memset(&sin, 0, sizeof (sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(options.portno);
    sin.sin_addr.s_addr = INADDR_ANY;
    if (bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0)
        bail_out(EXIT_PARITY_ERROR, "Failed to bind to Port");

    //-----listen-----//
    if (listen(sockfd, 5) < 0)
        bail_out(EXIT_PARITY_ERROR, "Server can't accepted connection");

    //-----accept-----//
    int sock_len = sizeof peer_addr;
    if ((connfd = accept(sockfd, (struct sockaddr*)&peer_addr, (socklen_t *)&sock_len)) < 0) //fragen
        bail_out(EXIT_PARITY_ERROR, "Can't accept connection to Client");
    /* accepted the connection */

   //Some other Code which has nothing to do with my Error!

    /* read from client (WORKS FINE!!)*/
    if (read_from_client(connfd, &buffer[0], READ_BYTES) == NULL) {
        if (quit) break; /* caught signal */
            bail_out(EXIT_FAILURE, "read_from_client");
    }
    request = (buffer[1] << 8) | buffer[0];
    DEBUG("Round %d: Received 0x%x\n", round, request);

    /* compute answer */
    correct_guesses = compute_answer(request, buffer, options.secret);
    if (round == MAX_TRIES && correct_guesses != SLOTS) {
        buffer[0] |= 1 << GAME_LOST_ERR_BIT;
    }

    DEBUG("Sending byte 0x%x\n", buffer[0]);


    /* send message to client */
    if (send_to_client(sockfd, &buffer[0], WRITE_BYTES) == NULL) { //Error in this Method!
        if (quit) break; /* caught signal */
            bail_out(EXIT_FAILURE, "can't send message!");
    }

方法:

static uint8_t *send_to_client(int fd, uint8_t *buffer, size_t n)
{
    /* loop, as packet can arrive in several partial reads */
    size_t bytes_send = 0;
    do {
        ssize_t r = send(fd, buffer + bytes_send, n - bytes_send, 0); //Program stops HERE!
        printf("%d\n", (int)r); //This and the following lines will not be executed!
        if (r <= 0) {
            return NULL;
        }
        bytes_send += r;
    } while (bytes_send < n);

    if (bytes_send < n) {
        return NULL;
    }
    return buffer;
}

客户:(可能有用)

sockfd = cnt_to_server(argv[1], argv[2]);
uint8_t buffer;
uint16_t msg_buffer;
    do
    {
        msg_buffer = generate_msg(&msg);
        printf("Sending byte 0x%x\n", msg_buffer);
        if (send_to_server(sockfd, &msg_buffer, WRITE_BYTES) == NULL) //works
            error_exit(EXIT_FAILURE, "can't send message!");
        if (read_from_server(sockfd, &buffer, READ_BYTES) == NULL) //NULL
            error_exit(EXIT_FAILURE, "can't read message!");
        printf("received byte 0x%x\n", buffer);
    } while (game_continue(buffer, &msg));

    (void)close(sockfd);

方法:

uint8_t* read_from_server(int fd, uint8_t *buffer, int n)
{
    /* loop, as packet can arrive in several partial reads */
    size_t bytes_recv = 0;
    do {
        ssize_t r;
        r = recv(fd, buffer + bytes_recv, n - bytes_recv, 0); //0
        printf("%d\n", (int)r);
        if (r <= 0) {
            return NULL;
        }
        bytes_recv += r;
    } while (bytes_recv < n);

    if (bytes_recv < n) {
        return NULL;
    }
    return buffer;
}

int cnt_to_server(const char *par_server, const char *par_port)
{
    struct sockaddr_in server;
    struct hostent *hp;

    int  sockfd;

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        error_exit(EXIT_FAILURE, "could not create Socket");

    server.sin_family = AF_INET;

    if ((hp = gethostbyname(par_server)) == 0)
        error_exit(EXIT_FAILURE, "host error!");

    memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
    server.sin_port = htons(parse_port(par_port));

    if (connect(sockfd, (struct sockaddr*) &server, sizeof server) < 0)
        error_exit(EXIT_FAILURE, "could not connect!");

    return sockfd;
}

感谢您帮我解决这个问题!

勺子马里奥

改变

if (send_to_client(sockfd, &buffer[0], WRITE_BYTES) == NULL)

if (send_to_client(connfd, &buffer[0], WRITE_BYTES) == NULL)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C posix套接字,无法从客户端向服务器发送数据

来自分类Dev

C ++服务器无法通过套接字从python客户端读取我的消息

来自分类Dev

Spring Integration和TCP服务器套接字-如何向客户端发送消息?

来自分类Dev

从Node JS Socket客户端向MINA套接字服务器发送消息

来自分类Dev

如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

来自分类Dev

套接字服务器无法接收客户端发送的消息

来自分类Dev

服务器无法向客户端发送消息

来自分类Dev

通过python中的TCP套接字在客户端-服务器之间发送文件?

来自分类Dev

通过python中的TCP套接字在客户端-服务器之间发送文件?

来自分类Dev

无法通过Netty从服务器向客户端发送消息

来自分类Dev

无法通过Netty从服务器向客户端发送消息

来自分类Dev

使用C中的套接字将文件从客户端发送到服务器

来自分类Dev

通过套接字将Java客户端中的int写入c服务器

来自分类Dev

使用套接字从服务器向客户端发送静态文件

来自分类Dev

无法从Java套接字服务器接收数据到C套接字客户端

来自分类Dev

通过ActionScript服务器和Java客户端之间的套接字发送对象

来自分类Dev

服务器向客户端发送消息

来自分类Dev

服务器向客户端发送消息

来自分类Dev

从服务器向 websocket 客户端发送消息

来自分类Dev

C客户端/服务器套接字错误

来自分类Dev

使用套接字C#客户端/服务器发送文件

来自分类Dev

socket.io 客户端无法向服务器发送消息

来自分类Dev

客户端/服务器/客户端通过套接字通信

来自分类Dev

通过Java中的套接字将文件从客户端传输到服务器

来自分类Dev

两个客户端无法在套接字客户端-服务器连接中互相交谈

来自分类Dev

TCP套接字,发送文件,客户端服务器,服务器不保存整个文件,C语言

来自分类Dev

从服务器向SignalR 2.0中的客户端发送消息

来自分类Dev

如何理解客户端在服务器中向哪个路由发送了Websocket消息?

来自分类Dev

如何从Qt中的服务器向连接的客户端发送消息

Related 相关文章

  1. 1

    C posix套接字,无法从客户端向服务器发送数据

  2. 2

    C ++服务器无法通过套接字从python客户端读取我的消息

  3. 3

    Spring Integration和TCP服务器套接字-如何向客户端发送消息?

  4. 4

    从Node JS Socket客户端向MINA套接字服务器发送消息

  5. 5

    如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

  6. 6

    套接字服务器无法接收客户端发送的消息

  7. 7

    服务器无法向客户端发送消息

  8. 8

    通过python中的TCP套接字在客户端-服务器之间发送文件?

  9. 9

    通过python中的TCP套接字在客户端-服务器之间发送文件?

  10. 10

    无法通过Netty从服务器向客户端发送消息

  11. 11

    无法通过Netty从服务器向客户端发送消息

  12. 12

    使用C中的套接字将文件从客户端发送到服务器

  13. 13

    通过套接字将Java客户端中的int写入c服务器

  14. 14

    使用套接字从服务器向客户端发送静态文件

  15. 15

    无法从Java套接字服务器接收数据到C套接字客户端

  16. 16

    通过ActionScript服务器和Java客户端之间的套接字发送对象

  17. 17

    服务器向客户端发送消息

  18. 18

    服务器向客户端发送消息

  19. 19

    从服务器向 websocket 客户端发送消息

  20. 20

    C客户端/服务器套接字错误

  21. 21

    使用套接字C#客户端/服务器发送文件

  22. 22

    socket.io 客户端无法向服务器发送消息

  23. 23

    客户端/服务器/客户端通过套接字通信

  24. 24

    通过Java中的套接字将文件从客户端传输到服务器

  25. 25

    两个客户端无法在套接字客户端-服务器连接中互相交谈

  26. 26

    TCP套接字,发送文件,客户端服务器,服务器不保存整个文件,C语言

  27. 27

    从服务器向SignalR 2.0中的客户端发送消息

  28. 28

    如何理解客户端在服务器中向哪个路由发送了Websocket消息?

  29. 29

    如何从Qt中的服务器向连接的客户端发送消息

热门标签

归档