ネットワーク アプリケーション プロジェクトに問題があります。
これは私の主要な構造の一部です:
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" ?
みんなに感謝します:)
Ps : データの長さを文字列に変換して送信し、riceviMsg() 関数で処理しようと思います。riceviLenght() は完全に間違っているので削除します。しかし、riceviMsg() のバッファが正しく機能するかどうかはわかりません :/