如何通过套接字发送int?

时间:2017-11-11 05:42:52

标签: c++ sockets

我正在学习使用C ++进行非常基本的套接字编程 我被困在我试图发送随机生成的int的部分 在插座上。

server.cpp

int code = rand();
send(connfd, (char*)code, sizeof(int), 0);

client.cpp

int code = 0;
recv(connfd, (char*)code, sizeof(int), 0);

我做错了什么?

1 个答案:

答案 0 :(得分:3)

首先:

  1. 您没有检查任何一个来电的返回值。插座是臭名昭着的(天生)容易出错。

  2. 假设所有字节都将一起发送和接收 - 但TCP很容易出现分段,碎片,部分发送和各种各样的东西,你永远不应该假设你接收到一次通话中发送的所有内容。这使得检查返回值变得更加重要!

  3. 你做的那个:(char*)code是不正确的。更适合做(char*)&code,但它不会识别部分接收。

  4. 假设您正在使用TCP套接字:

    发送:

    int data = rand();
    char* tosend = (char*)&data;
    int remaining = sizeof(data);
    int result = 0;
    int sent = 0;
    while (remaining > 0) {
        result = send(connfd, tosend+sent, remaining, 0);
        if (result > 0) {
            remaining -= result;
            sent += remaining;
        }
        else if (result < 0) {
            printf("ERROR!\n");
            // probably a good idea to close socket
            break;
        }
    }
    

    接收:

    int value = 0;
    char* recv_buffer = (char*)&value;
    int remaining = sizeof(int);
    int received = 0
    int result = 0;
    while (remaining > 0) {
        result = recv(connfd, recv_buffer+received, remaining, 0);
        if (result > 0) {
            remaining -= result;
            received += result;
        }
        else if (result == 0) {
            printf("Remote side closed his end of the connection before all data was received\n");
            // probably a good idea to close socket
            break;
        }
        else if (result < 0) {
            printf("ERROR!\n");
            // probably a good idea to close socket
            break;
        }
    }
    

    对于UDP套接字,一些主体在错误检查方面保持不变,向内存缓冲区转换或从内存缓冲区转换。但是使用UDP,你不应该进行&#34;循环&#34;因为UDP是一种数据报协议。