怪事阿 高手指点了马上给分

mhmdanger 2005-07-29 01:44:56
最近遇到一个怪事,在一个函数中前面的SendBuf可以执行成功,后面的却不行,以下是代码:
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{int ulen,nlen;
char uname[17];
char nname[17];
int sex;
int totalsendlen=0;
int sendlen=0;
AnsiString myrecv,commandflag;
myrecv=Socket->ReceiveText();
strcpy(recvstr,myrecv.c_str());
commandflag=myrecv.SubString(1,3);
//Memo1->Lines->Add(AnsiString(recvstr));
if(commandflag=="LI_") //login
{ int i;
if(ServerRoom->PlayerList->Count>=ServerRoom->MaxNumOfPlayer)
{return ;
}
ulen=recvstr[3];
nlen=recvstr[4+ulen];

for(i=0;i<ulen;i++)
{uname[i]=recvstr[4+i];
}
uname[i]='\0';
for(i=0;i<nlen;i++)
{nname[i]=recvstr[4+ulen+1+i];
}
nname[i]='\0';
sex=recvstr[4+ulen+nlen+1];
Player *tmp;
for(int j=0;j<ServerRoom->PlayerList->Count;j++)
{tmp=(Player *)ServerRoom->PlayerList->Items[j];
if(strcmp(uname,tmp->username)==0)
{sendstr[0]='N';
sendstr[1]='L';
sendstr[2]='_';
sendstr[3]='\0';
Socket->SendBuf(sendstr,4);
return;
}
}
tmpplayer=new Player(uname,nname,sex);

Socket->Data=tmpplayer;
ServerRoom->NumOfPlayer++;

sendstr[0]='U';
sendstr[1]='R';
sendstr[2]='_';
sendstr[3]=ulen;
strcpy(&sendstr[4],uname);
sendstr[4+ulen]=nlen;
strcpy(&sendstr[4+ulen+1],nname);
sendstr[4+ulen+1+nlen]=tmpplayer->sex;
sendstr[4+ulen+1+nlen+1]=tmpplayer->state;
sendstr[4+ulen+1+nlen+1+1]='\0';


for(int j=0;j<ServerSocket1->Socket->ActiveConnections;j++)
{sendlen=0;
totalsendlen=0;
while(totalsendlen<strlen(sendstr)+1)
{sendlen=ServerSocket1->Socket->Connections[j]->SendBuf(sendstr+totalsendlen,strlen(sendstr)+1-totalsendlen);
if(sendlen==-1)
{totalsendlen+=0;
}
else
{totalsendlen+=sendlen;
}
}
//ServerSocket1->Socket->Connections[j]->SendText(AnsiString(" "));
}

/*问题就在这儿了,上面的代码成功执行,下面的程序执行了但是好像没有发送出去,反正接受方没有收到*/

sendstr[0]='C';
sendstr[1]='H';
sendstr[2]='_';
char *come="] come in!";
sendstr[3]=1+ulen+strlen(come);
sendstr[4]='[';
strcpy(&sendstr[5],uname);
strcpy(&sendstr[5+ulen],come);
sendstr[5+ulen+strlen(come)]='\0';

int kk=strlen(sendstr);

for(int j=0;j<ServerSocket1->Socket->ActiveConnections;j++)
{sendlen=0;
totalsendlen=0;
while(totalsendlen<strlen(sendstr)+1)
{sendlen=ServerSocket1->Socket->Connections[j]->SendBuf(sendstr+totalsendlen,strlen(sendstr)+1-totalsendlen);
if(sendlen==-1)
{totalsendlen+=0;
}
else
{totalsendlen+=sendlen;
}
}
//ServerSocket1->Socket->Connections[j]->SendText(AnsiString(" "));
}
Memo1->Lines->Add(AnsiString(&sendstr[4]));



}
else if(commandflag=="CH_") //chat
{
}
backbuffer->Canvas->Draw(0,0,tmpbuffer);
ServerRoom->drawplayer(backbuffer);
Image1->Canvas->Draw(0,0,backbuffer);
}
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhmdanger 2005-07-31
  • 打赏
  • 举报
回复
楼上的方法确实可以,谢了阿
iec 2005-07-31
  • 打赏
  • 举报
回复
//不采用延时算法试一试看
long bNodelay = 1;


setsockopt(
Socket->SocketHandle,
IPPROTO_TCP,
TCP_NODELAY,
(char *)&bNodelay,
sizeof(bNodelay)
);
raystone 2005-07-30
  • 打赏
  • 举报
回复
这样的问题我也遇见过,建议使用消息处理机制,用消息PostMessage()或SendMessage()进行下一消息的发送
mhmdanger 2005-07-30
  • 打赏
  • 举报
回复
很可能有楼上说的原因 真是奇怪
不过好像在每个SendBuf()前面加一个Sleep(100)就可以了 太它MM的奇怪了
zqhkd 2005-07-29
  • 打赏
  • 举报
回复
这种问题基本上可肯定是字符串使用上的问题。一般是字符串变量地址分配或者字符数组大小定义存在问题,从而造成某些莫名其妙的问题,特别是这种某些时候可以,某些时候不行的情况。
mhmdanger 2005-07-29
  • 打赏
  • 举报
回复
同一个socket在时间间隔很短的情况下是不是不能再次发送信息???帮帮我吧

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧