社区
网络及通讯开发
帖子详情
请教socket接受数据的问题
Beginner_mine
2006-04-05 10:19:50
我用TSocketServer建了一个SocketServer,采用非阻塞模式同时接受来自24个Client的数据传输,当收到其中一个Client的数据后,先进行解包,等这个Client的数据包(一条记录分100个包)都发送完毕后,把解包后的数据组合成一条记录。
我用OnClientRead事件中用ReadBuffer来接受.我如何来区分当前收到的包是几号Client发送的.能否为每个Client的数据接受开辟一个缓存区?
...全文
409
13
打赏
收藏
请教socket接受数据的问题
我用TSocketServer建了一个SocketServer,采用非阻塞模式同时接受来自24个Client的数据传输,当收到其中一个Client的数据后,先进行解包,等这个Client的数据包(一条记录分100个包)都发送完毕后,把解包后的数据组合成一条记录。 我用OnClientRead事件中用ReadBuffer来接受.我如何来区分当前收到的包是几号Client发送的.能否为每个Client的数据接受开辟一个缓存区?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Joininthefun
2006-08-22
打赏
举报
回复
guanzhu
Beginner_mine
2006-04-06
打赏
举报
回复
谢谢各位...
netsys2
2006-04-05
打赏
举报
回复
我如何来区分当前收到的包是几号Client发送的.能否为每个Client的数据接受开辟一个缓存区?
--->每个client都和server建立了不同的socket对象,再触发读事件时,传入的socket对象是不同的!
即使同一IP来的socket也不同,所以你可以根据这个来区分数据。
常用的做法是client连接时记录其socket对象值,然后收到数据后对比socket,把数据拼包。
Beginner_mine
2006-04-05
打赏
举报
回复
好的.谢谢
Jim@luckeeinc.com
2006-04-05
打赏
举报
回复
不好意思 我没有指定Buffer的源码。
就像alloutoflove(andrew)所说的可以用个数据结构来存放对应的Client发过来的信息。用IP+端口来区分不同的Client应该是可行的。
Beginner_mine
2006-04-05
打赏
举报
回复
Ring_Pt,能否把指定Buffer的原码发出来看看.
Beginner_mine
2006-04-05
打赏
举报
回复
请问还有好点的处理模式没有?因为这个Socket要求接收数据的完整性、及时性、稳定性。
Jim@luckeeinc.com
2006-04-05
打赏
举报
回复
你这种工作模式应该是可行的,我们以前在做的时候也是采取先存在一边,再插数据库的方法。
而且个人觉得最好也是这么做,如果一读到数据就入库在数据量大的时候会出现问题,很有可能数据与数据之间的到达的时间间隔小于数据库的处理时间。
至于为每个Client的数据指定一个Buffer,还是用IP+端口 来区分不同的Client端
alloutoflove
2006-04-05
打赏
举报
回复
自己在服务端建立一个数据结构存放和具体每个Client有关的信息, 包括其相应的buffer, 不过如果照你所说的话可能要想点别的办法, buffer需要的太大了.
Beginner_mine
2006-04-05
打赏
举报
回复
由于数据传输的压力非常大.大概1分钟数据流量大概为20-50M之间.
当收到这些数据包后,要分别解包,把记录插入数据库.
我是考虑这样的工作模式:SocketServer只负责接受数据,并把对应Client发送的数据包放入对应的Buffer中.我在后台用多线程来处理这Buffer中的数据,包括解包,组装,插库.
这种工作模式是否有可行之处??
还是一个老问题.我能否为每个Client的数据指定一个Buffer.
Jim@luckeeinc.com
2006-04-05
打赏
举报
回复
你所说的几号Client 应该没什么编号吧
不过是可以得到Client的IP,端口什么的信息
alloutoflove
2006-04-05
打赏
举报
回复
OnClientRead事件的第二参数指明了具体的客户Socket, 偶个人觉得在用这些现成控件前最好看一下API级别的原理, 否则很容易莫名其妙...
pp616
2006-04-05
打赏
举报
回复
或许这种方法对楼主有帮助
#include <vector>
using namespace std;
//记录socket信息的结构
typedef struct _SOCKDATA{
int iSocket;
TMemoryStream *pStm;
_SOCKDATA(const int Sock){
iSocket=Sock;
pStm=new TMemoryStream;
}
~_SOCKDATA(){delete pStm;}
}SOCKDATA,*LPSOCKDATA;
//查找对应的信息用的类
class _FindSocket{
private:
int Sock;
public:
_FindSocket(int Socket):Sock(Socket){}
bool operator()(LPSOCKDATA &Val){
return Val->iSocket==Sock;
}
};
vector<LPSOCKDATA> SockList; //socket信息列表
vector<LPSOCKDATA>::iterator SockIt; //socket信息列表元素指针
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
LPSOCKDATA pdata=new SOCKDATA(Socket->SocketHandle);
SockList.push_back(pdata);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
char *pbuf;
int irlen;
irlen=Socket->ReceiveLength();
pbuf=(char *)malloc(irlen);
Socket->ReceiveBuf(pbuf,irlen);
SockIt=find_if(SockList.begin(),SockList.end(),_FindSocket(Socket->SocketHandle));
if(SockIt!=SockList.end())
{
(*SockIt)->pStm->Write(pbuf,irlen);
}
free(pbuf);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
SockIt=find_if(SockList.begin(),SockList.end(),_FindSocket(Socket->SocketHandle));
if(SockIt!=SockList.end())
{
SockList.erase(SockIt);
delete *SockIt;
}
}
客户端app多个线程对一个
socket
发送
数据
客户端一般是一个发送线程,一个
socket
多个发送线程竞争一个
socket
没什么意义,不会提高发送速度,因为
socket
只有一个,只要
socket
在发送一个线程的
数据
时,该
socket
就被占用了,是不会响应其他线程的发送
数据
请求的。除非客户端维护有多个
socket
。 服务端使用多线程向多个客户端同时发送
数据
是因为服务端维护着多个
socket
,每个
socket
对应一个客户端session连接。 参考: 客户端:多线程使用单个
SOCKET
发数
请教
:多线程使用同一个
socket
进行
数据
收发会出现什么
问题
?
socket
网络接收
数据
问题
(0X00
问题
)
在用vc++6.0中做网络通讯时,用 recv(
SOCKET
s, char* buf, int len, int flags); 发现接收到的
数据
会 把00截取掉,如服务端发送十六进制的“30 31 32 33 00 34 35”,这边接收到的
数据
只有“30 31 32 33 ”这个了,不知道什么原因,
请教
高手! ==============================
异步
Socket
接收
数据
后缓存处理
问题
异步接收
数据
都正常,是个定长TLV包,但是接收到后都是直接写入bufflist后再getdata出来处理,发现有时会有掉包情况,以为是线程安全
问题
,后来加入了lock段将bufflist内代码锁住,依然会有掉包现象,导致组包失败,
请教
了一些人,回答仍然是线程安全
问题
,请问是否有更好的处理办法,如有请贴出代码,因为理论我都明白,也不是解包
问题
(这个解包方式只是随便写的简单方式)现需要能实际解决缓存数
php自动向服务器发送
数据
,php
socket
往服务器端发送
数据
php模拟
socket
一次连接,多次发送
数据
的如何实现代码复制代码 代码如下: 复制代码 代码如下:关于PHP
socket
多次收发
数据
的
问题
请教
php大神,php如何实现点击页面上的一个按钮发我百度能找到的都是控制台启动服务器和客户端,然后相互通信,我现在有1.参考资料
socket
_create()函数需要三个参数:一个协议、一个
socket
类型、一个公共协议。
socket
_create()...
【UE5】UE5与Python
Socket
通信中文
数据
接收不全
问题
就出在Count的值上,可以看到在上面的代码中我们是直接计算的FString的长度,然后以这个长度作为发送的
数据
大小,在纯英文的
数据
中这没有任何
问题
,但在中文
数据
中,由于中文编码的特殊性,FString应该有做特殊的编码处理,导致直接计算FString的长度作为发送
数据
的字节大小其实是小于真实
数据
大小的,这就导致在UE端发送中文
数据
时就没有发送完整到
数据
,所以Python端接收到
数据
就出现
数据
不全的
问题
。最近在使用UE的
Socket
模块与Python服务器进行通信时遇到了一些坑,特此记录一下。
网络及通讯开发
1,316
社区成员
8,873
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章