c - 由于其范围,使用 unsigned char 而不是 char

标签 c sockets tcp char unsigned

我一直在开发一个小型的纯 C 客户端应用程序(我的第一个 :/),它使用 TCP 套接字与服务器进行通信。服务器向我发送一个数据包(C 结构),其中第一个字节包含数据包的大小。

问题是服务器使用 unsigned char 来表示数据包的大小,因为 char 是有符号的(从 -128 到 +127)并且 +127 不足以表示在某些数据包中可以达到 255 的大小。 => 我需要一个无符号字符缓冲区;

在 Linux 中,recv() 函数的第二个参数是 void * ,这意味着我可以声明一个 void *buffer 并且没有问题。但是 Windows (MinGW) 中的 recv() 具有 char * 而不是 void *。这给我警告“参数类型不匹配:不兼容的指针类型‘char *’和‘unsigned char *’”

有没有可能解决这个问题?这是代码。谢谢。

PS:我使用的是非阻塞套接字。

 int recvsize = 0;
unsigned char tmpsize;
int index = 0;
unsigned char *buffer;

while (1) {

    recvsize = recv(server, &tmpsize, sizeof(unsigned char), 0); // every packet starts with one byte where is its length

    if (recvsize > 0 ) {
         buffer = malloc(tmpsize * sizeof(unsigned char)); //memory allocation according to the size of packet
         buffer[0] = tmpsize--; //get back the size value to the buffer
         recvsize = 0;


        do { //loop over and over until you do not have all bytes of the packet
            recvsize = recv(server, &buffer[++index], tmpsize, 0);

            if (recvsize == 0)
                break;


            tmpsize -=recvsize;
            index += recvsize;

        } while (tmpsize != 0);

    }
sleep(50);
}

最佳答案

只需将指针转换为正确的类型。所以使用:

(char *) (&buffer[++index])

此外,为什么要通过在 sleep 循环中重复非阻塞操作来创建阻塞方案?使用阻塞套接字或使用非阻塞套接字,但不要在中间创建一些假的东西。 (例如,如果恶意或慢速客户端只向您发送一个字节,您将在 recv 上旋转。)

最后,为什么在第一次调用 recv 时只读取一个字节?无论如何你都需要其余的数据,那么为什么要让内核一点一点地给你呢?为什么不尽可能多地读取字节,如果幸运的话,避免第二次调用 recv

关于c - 由于其范围,使用 unsigned char 而不是 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386158/

相关文章:

c++ - 是否有将信号处理(c 库)映射到 c++ 异常的可能方法?

c - 在套接字上设置 TCP ECN (C Linux)

c - TCP多客户端服务器程序

delphi - IdTCPServer 如何使用 OnExecute 发送和接收来自特定客户端的应答

c - 是否有可以处理 C 内联结构的 MSVC 版本?

c - GCC 函数名冲突

c++ - 在每 t 毫秒执行一次 c++ 代码时执行测量

sockets - 哪种技术最适合立即通知客户端服务器事件?

java - ObjectInputStream/ObjectOutputStream 工作不正常

java - 如何在具有 I/O 多路复用的 Java 服务器中异步处理请求?