超奇怪的问题,大家来看看

xwy1982 2005-06-21 11:50:45
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString NickName;
int nklen;
if(InputQuery("登陆到服务器","请输入你的昵称:",NickName)) //输入昵称
{
ClientSocket1->Active=true;
nklen=NickName.Length();
NickName=IntToStr(nklen)+NickName+"@login@@";
ClientSocket1->Socket->SendText(NickName);
}
else ShowMessage("请输入你的昵称.");
}
这样的话,要点第二次服务器才会收到,如果把ClientSocket1->Active=true;放到第一句就正常了,谁知道为什么?
...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2005-06-23
  • 打赏
  • 举报
回复
对于非阻塞型的Socket,调用 ClientSocket1->Active=true; 后,Socket 还没有真正连接上,需要在收到OnConnect事件后才真正连接上。而对于阻塞型的Socket,在执行 ClientSocket1->Active=true; 后,Socket就真正连接上了。
也许你认为,既然这样的话,那么就一定是阻塞型的Socket比较好,其实也不是。如果你不使用多线程,那么在使用阻塞型的Socket时,当你调用 ClientSocket1->Active=true; 后,程序就一直在等待连接上对方(或者连接超时、出错)才返回。在连接过程中,程序不会响应任何消息。而非阻塞型则没有这个问题。所以阻塞型的Socket,一般都使用多线程的方式来做。
另外,非阻塞型的Socket,使用事件(OnConnect、OnError、OnRead等)来拦截异常和错误,而阻塞型的Socket,则使用try catch来拦截(阻塞型的Socket,没有上面的OnRead、OnError等事件)。
jishiping 2005-06-23
  • 打赏
  • 举报
回复
原因很简单,你的ClientSocket为非阻塞型的(也就是属性ClientType为ctNonBlocking),将ClientType改为ctBlocking就可以了。
F117p 2005-06-22
  • 打赏
  • 举报
回复
你在建立Socket连接前,指定了Host和Port?
xwy1982 2005-06-22
  • 打赏
  • 举报
回复
服务器端是这样的
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString Data=Socket->ReceiveText();
Label2->Caption=Data;
}
xwy1982 2005-06-22
  • 打赏
  • 举报
回复
指定了,要不然第二次也不会成功

1,317

社区成员

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

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