关于非阻塞socket通信的问题,急急急~~

lonelybird818 2007-01-17 05:06:36
环境描述:
tserversocket控件编写服务器端控制软件
采用非阻塞模式与client端进行通信
处理过程大致如下:
在Read事件里接受client发送过来的数据,如果合法则开辟线程,并将该连接的socket与数据一起传递给线程,线程处理完数据后,再通过传递进来的socket发送出去。
问题描述:
当只有一个client连接时,一切都正常。当多个client连接时,只有Read事件里接受到的第一个socket 有效,其他连接都无效了,但是activeconnections还保持有那些连接,发送数据,却怎么也发送不出去。
部分代码:
线程部分:
strcpy(cSendBuff,Trans(cType,cName,cBookInf));
nSendLen=strlen(cSendBuff);
for(int i=0;i<this->Socket->ActiveConnections;i++)
{
if(this->Socket->Connections[i]->RemoteAddress==this->cClientIP)
{
this->Socket->Connections[i]->SendBuf(cSendBuff,nSendLen);
}
}(省略了数据处理的过程)
线程传递的参数:
TThreadSend(TServerWinSocket *pSocket,AnsiString pClientIP,char * pBuff)

请各位老大指点~~急急~~24小时在线等~~~
...全文
402 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbkopoky 2007-02-17
  • 打赏
  • 举报
回复
有一个香港和悦网络电话的源文件 ,有兴趣妨进入我的BLOG看看
pp616 2007-01-18
  • 打赏
  • 举报
回复
做了个实验 下面是大概的代码
//Unit1.cpp
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
char *buf=(char *)malloc(Socket->ReceiveLength()+1);
memset(buf,0x00,Socket->ReceiveLength()+1);
Socket->ReceiveBuf(buf,Socket->ReceiveLength()+1);
ThreadSend *psend=new ThreadSend(true,Socket,buf);
free(buf);
}

//Uint2.h
#ifndef Unit2H
#define Unit2H
#include <Classes.hpp>
#include <ScktComp.hpp>
class ThreadSend : public TThread
{
private:
const TCustomWinSocket *Sock;
char * Buff;
void __fastcall Execute();
public:
__fastcall ThreadSend(bool CreateSuspended,const TCustomWinSocket * &pSocket,const char * pBuff);
__fastcall ~ThreadSend(){free(Buff);};
};
#endif

//unit2.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
__fastcall ThreadSend::ThreadSend(bool CreateSuspended,const TCustomWinSocket * &pSocket,const char * pBuff)
: TThread(CreateSuspended),Sock(pSocket)
{
Buff=(char *)malloc(strlen(pBuff)+1);
memset(Buff,0x00,strlen(pBuff)+1);
strcpy(Buff,pBuff);
this->FreeOnTerminate=true;
this->Resume();
}
void __fastcall ThreadSend::Execute()
{
Sleep(1000); //1秒后再发回显
int nSendLen=strlen(Buff);
try{
if(Sock->Connected)
Sock->SendBuf(Buff,nSendLen);
}
catch(...){};
}

我模拟了3个client不停的给server发数据回显都很正常。如果楼主在线程里检测连接已断开了那就好好检查代码吧。或许Client端主动断开了。
lonelybird818 2007-01-17
  • 打赏
  • 举报
回复
楼上的大大还在么~~
我按照你的方法修改了下
参数传递方式:
将clientread事件中的socket作为参数传递给线程
线程类里定义了一个TCustomWinSocket *psocket
处理后的发送为:
try{
if(pSocket->Connected)
pSocket->SendBuf(cSendBuff,nSendLen);
}
但是 通过断点发现,每次pSocket->Connected的值都为false,这是怎么回事啊
pp616 2007-01-17
  • 打赏
  • 举报
回复
pSocket 参数为ClientRead事件中的Socket参数
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{

}
pp616 2007-01-17
  • 打赏
  • 举报
回复
TThreadSend(TServerWinSocket *pSocket,AnsiString pClientIP,char * pBuff)
改为
TThreadSend(TCustomWinSocket *pSocket, //直接把对应的Socket指针传如线程
//AnsiString pClientIP, IP可以通过pSocket->RemoteAddress
char * pBuff)
//处理完后发送改为
strcpy(cSendBuff,Trans(cType,cName,cBookInf));
nSendLen=strlen(cSendBuff);
try{
if(pSocket->Connected)
pSocket->SendBuf(cSendBuff,nSendLen);
}

1,316

社区成员

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

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