Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP recv和接收缓冲区_C_Sockets_Recv_Tcpsocket - Fatal编程技术网

TCP recv和接收缓冲区

TCP recv和接收缓冲区,c,sockets,recv,tcpsocket,C,Sockets,Recv,Tcpsocket,我的网络应用程序项目有问题 这是我的主要结构的一部分: struct elemento { char username[256]; short int UDPport; unsigned long IPaddress; int socket; char buffer[256]; int last; struct elemento *next; //puntat

我的网络应用程序项目有问题

这是我的主要结构的一部分:

    struct elemento 
    { 
        char username[256]; 
        short int UDPport;
        unsigned long IPaddress;
        int socket; 
        char buffer[256];
        int last; 
        struct elemento *next; //puntatore all'elemento successivo della lista
        struct elemento *enemy; //puntatore alla struttura dell'avversario
    };

typedef struct elemento player; 


player *client = NULL; //punta al client attualmente gestito
这是处理recv返回值的函数

int recvTCP(int sd, void* buf, int len)  
{
  int ret;
  ret = recv(sd,buf,len,0);
  if (ret<len)
 {
    if(ret==0)  
    {
        /
        FD_CLR(sd,&master); 
        close(sd); //chiudo la socket
        printf("%s si è disconnesso dal server\n",client->username);
        if(client->impegnato==YES)  
        {
            //notifica(client->enemy->socket);
        }
        if(client->ready==YES)
        {
            numerogiocatori--; 
        }
        elem_remove(client); 
        return -1; 
    }

    return ret; 

}
return 0; 
 }
这是处理数据缓冲的函数:

int riceviMsg()
{
    int ret;
    ret = recvTCP(client->socket,&(client->buffer[client->last]),client->length);
    if(ret<0) return -1; 
    if(ret==0) 
    {
        client->last=0; 
        return 0; 
    }
    client->last=ret;
    client->length=(client->length)-(client->last);  
    return ret;
}
这是处理INT变量recv的函数:

int riceviLength() 
{

  int ret;
  int temp; 
  ret = recvTCP(client->socket,&temp,4-client->last);
  client->length=(client->length)<<(8*(ret)); 
  client->length=(client->length)|temp;  
  if(ret<0) return -1; 
  if (ret==0)  
  {
    client->last=0;
    return 0;
  }
  client->last=client->last-ret;
  return ret;
}
我想最后一个是完全错误的。我之所以说“假设”,是因为我正在本地主机上试用该应用程序,而且很少只接收部分数据

关于riceviMsg,我有一个疑问:

如果我发送ciao\0,则在另一侧接收哪封信作为第一封?c还是\0

谢谢大家:

注:我想我会在将数据转换成字符串后发送数据的长度,并使用ricevimg函数处理它。我将删除riceviLenght,因为它完全错误。
但现在我不知道riceviMsg上的缓冲区是否正常工作://

这里有些东西毫无意义。。。你想用client->length=client->lengthlast-ret;完成什么?我尝试将之前读取的部分整数移到左边,并将到达的int的新部分添加到其中。但现在我假设在将数据转换为字符串后,我将发送数据的长度,并使用ricevimg函数进行处理,但我不知道ricevimg上的缓冲区是否正常工作:/但是,当您接收到更多数据时,您正在降低client->last,而对recvTCP的调用似乎假设它随着更多数据的增加而增加……切换到文本无论如何,协议可能是个好主意。文本协议是个好主意?我将使用sprintf转换字符串中的整数。整数是4字节,所以我必须使用5字节字符串,对吗?示例:0001/0