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

时间:2015-09-03 22:03:27

标签: c sockets tcp char unsigned

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

问题是服务器使用unsigned char来表示数据包的大小,因为char已签名(从-128到+127)而+127不足以表示某些数据包中最多可达255的大小。 =>我需要一个unsigned char缓冲区;

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

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

PS:我使用的是NON BLOCKING套接字。

#include <limits.h>

int smallest(){
  int tyy;
  for(tyy=0; tyy<11;tyy++){
    int small = INT_MAX;
    int numbers;
    printf("input numbers");
    scanf("%d", &numbers);
    int blockloop;
  while ((blockloop=getchar()) != EOF && blockloop != '\n');
    if (numbers<small){
      small = numbers;
    printf("\n",numbers);
    }
  }
  return 0;
}

1 个答案:

答案 0 :(得分:2)

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

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

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

最后,为什么在第一次调用recv时只读取一个字节?无论如何你还需要剩下的数据,那么为什么要让内核以微小的方式给你呢?为什么不尽可能多地读取字节,并且运气好,避免再次调用recv