首先感谢CSDN,请教各位高手(JSP kingcaiyao(AKing) pp616 (傻小子) ... )请进,关于Socket控件数据传输的问题

iec 2004-07-24 11:49:55
客户端 :TServerSocket
服务器端 :TClientSocket

客户端有100个数据结构大约31K的数据,数据长度大小不变,一个一个的传输到服务器端,服务器收到每个数据后对数据进行处理.

我的方法是客户端非阻塞式,循环发送,当服务器收完一个数据后,发送一个信息到客户端,客户端再发下一个数据.服务器端用ServerSocketRead()事件接收数据.在ServerSocketRead()中有个while循环,当接收数据长度等于发送数据的长度时,跳出该循环.在此期间客户端数据自动分包传输,服务器产生几次ServerSocketRead()事件,但是不进while循环.

为保证数据快速准确无误的传到服务器端,想寻求最佳的解决方案.
1.以上处理是否合理?
2.用阻塞式还是非阻塞式?
3.receivelength()是不是不能体现接受到实际长度?
请各位高手给与帮助!
...全文
169 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2004-07-26
  • 打赏
  • 举报
回复
ServerSocketRead 改成下面的写法看看:

ServerSocketRead(...)
{
len = ReceiveLength();
BYTE *tbuf =new BYTE[len];
receivebuf(tbuf,len);
memcpy(rbuf+sumlen,tbuf,len)
sumlen+=len;
delete[] tbuf;

if (sumlen>=sizeof(MyStrcuct)) {
//这儿写收到数据后的处理代码
}
}

不过有个问题,你这儿的BYTE *rbuf 和 int sumlen 是如何定义的?怎么来区分多个客户
端发送过来的数据?总不能用一个rbuf 和一个 sumlen 来处理所有的客户端的数据吧(这
样也必然是错误的)。
iec 2004-07-25
  • 打赏
  • 举报
回复
TO JSP: 因为客户端对每一个数据结构自动分包几次发送,所以服务器会产生几次ServerSocketRead()事件.

客户端 TServerSocket
服务器 TClientSocket

客户端发送:
MyStrcuct SendStrcuct;//31k
BYTE *sbuf =new BYTE[sizeof(MyStrcuct)];
memcpy(sbuf,&SendStrcuct,sizeof(MyStrcuct));
Socket->Sendbuf(sbuf,sizeof(MyStrcuct));

服务器接收:
MyStrcuct RecStrcuct;//31k
BYTE *rbuf =new BYTE[sizeof(MyStrcuct)];
int sumlen=0;
bool flag=true;
//事件
ServerSocketRead(...)
{
if(flag)
{
flag=false;
do
{
application->ProcessMessage();
len=ReceiveLength();
BYTE *tbuf =new BYTE[len];
receivebuf(tbuf,len);
memcpy(rbuf+sumlen,tbuf,len)
sumlen+=len;
delete tbuf;
}while(sumlen<sizeof(MyStrcuct))
}
}


iec 2004-07-25
  • 打赏
  • 举报
回复
TO JSP: 因为客户端对每一个数据结构自动分包几次发送,所以服务器会产生几次ServerSocketRead()事件.

客户端 TServerSocket
服务器 TClientSocket

客户端发送:
MyStrcuct SendStrcuct;//31k
BYTE *sbuf =new BYTE[sizeof(MyStrcuct)];
memcpy(sbuf,&SendStrcuct,sizeof(MyStrcuct));
Socket->Sendbuf(sbuf,sizeof(MyStrcuct));

服务器接收:
MyStrcuct RecStrcuct;//31k
BYTE *rbuf =new BYTE[sizeof(MyStrcuct)];
int sumlen=0;
bool flag=true;
//事件
ServerSocketRead(...)
{
if(flag)
{
flag=false;
do
{
application->ProcessMessage();
len=ReceiveLength();
receivebuf(tbuf,len);
memcpy(rbuf+sumlen,tbuf,len)
sumlen+=len;
}while(sumlen<sizeof(MyStrcuct))
}
}


jishiping 2004-07-25
  • 打赏
  • 举报
回复
还是大概写出你的代码流程,服务器收到数据后的处理代码不需要,只需要接收和发送的代码
就可以了。
jishiping 2004-07-25
  • 打赏
  • 举报
回复
楼主对Server端的处理没有说清楚,好像也是用非阻塞式。如果是这样,你的描述肯定有问
题。“在ServerSocketRead()中有个while循环,当接收数据长度等于发送数据的长度时,跳出
该循环”,这句话的意思,就是一开始就进入循环呢,怎么后面又出来一句“服务器产生几
次ServerSocketRead()事件,但是不进while循环”,你让大家怎么理解你的意思?
prophet2004 2004-07-25
  • 打赏
  • 举报
回复
听说编写Socket这种程序大多是用Api好些
用ClientSocket和ServerSocket好像不太好
纯冰糖 2004-07-25
  • 打赏
  • 举报
回复
用非阻塞式,帮你up
h2plus0 2004-07-25
  • 打赏
  • 举报
回复
我觉得象用socket写这种程序, 一般都比较复杂,
客户端最好用阻塞式的(比较简单), 服务器端用非阻塞式(性能高,复杂)。

如果你用阻塞的方式, 建议你看一下 Indy那些控件。

1,316

社区成员

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

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