关于TCP Socketde的问题?

zh_ff 2000-07-04 09:29:00
  当我在客户端使用clientsocket.socket.sendstream()或sendbuf()方法向服务器端发送数据时,客户端显示已经成功发出了数据而服务器端毫无反应,而当我使用senttext()方法时,服务器端则接收到了数据,有哪位能为我分析一下原因,谢谢!
...全文
172 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zh_ff 2000-07-05
  • 打赏
  • 举报
回复
说是TCP Socket的问题实际上是record type和tmemorystream的问题.当我定义了一个record后,用tmemorystream.write方法写入,如:
type
tmyrec=record
mychar:array [0..15] of char;
myword:word;
.....
mynum:array [0..31] of byte;
end;

var
rec:myrec;
mystream:tmemorystream;
begin
with rec do
begin
...
赋值
...
end;
mystream:=tmemorystream.create;
mystream.write(rec,sizeof(tmyrec));
clientsocket.socket.send(mystream);
.....
.....
end;
这样使用record和tmemorystream是否正确?希望高人伸一把手.
zh_ff 2000-07-05
  • 打赏
  • 举报
回复
致kxy:
是的,刚才我也做了个同样的实验,用SendStream和ReciveBuf发送和接收一个结构时一切正常,我估计问题还是出在我的语句运用上,我再仔细找找毛病,谢谢你为我做的分析。
kxy 2000-07-05
  • 打赏
  • 举报
回复
我改了一下Delphi的Chat Demo
用SendStream和ReciveBuf,发送和接收一个结构运行正常。
zh_ff 2000-07-05
  • 打赏
  • 举报
回复
致kxy:
有一点应该肯定,我的socket的连接绝对建立了.因为我上面的程序就是用于serversocket的onclientconnect事件和onclientread事件的,如果连接没有建立,就不会执行到这语句,也不会触发异常.
我清楚socket error codes 10057的含意,就是因为和事实冲突,我才搞不清楚的.如果客户端以sendtext方法发送字串,而服务端以receivetext方法接收,那么一切ok,但是使用我现在用的方法就是有问题,真是不明白怎么回事,所以我才怀疑我的句法是否正确.但我要交换的是个数据结构,又不能用sendtext的方法,真头疼!你有什么好办法?
kxy 2000-07-05
  • 打赏
  • 举报
回复
你的socket没有建立连接。
你可以看看delphi的chat Demo看看他是如何做的
zh_ff 2000-07-05
  • 打赏
  • 举报
回复
致kxy:
异常信息:**.exe raised exception class ESocketError with message 'windows socket error'(10057),on API 'rec'.process stopped.
winsock error codes 10057应该为:Socket is not connected.
我搞不懂为什么。
kxy 2000-07-05
  • 打赏
  • 举报
回复
看不出来
你把异常的信息贴出来。
zh_ff 2000-07-05
  • 打赏
  • 举报
回复
致kxy:
抱歉,我定义record时是使用packed的,忘了写了。
问题是当我用上面的方法从客户端发出信息后,在服务器端的应用程序用servercocket.socket.receivebuf()方法接收数据时,触发了EsocketError异常,但是我用receivelength()方法获得的长度同预想的一样,可能是我用receivelength()的语法有问题,能否帮我检查一下,多谢了!语法如下:

type
trecmsg=record
......
......
end; //结构同上

var
myrec:trecmsg;
len:integer;
begin
....
zeromemory(myrec,sizeof(trecmsg)); //这个语句没问题,但可能现在我写错了
len:=socket.receivelength;
socket.receivebuf(myrec,len);//此时出现异常
.....
....
end;
我这样用有问题吗?
kxy 2000-07-05
  • 打赏
  • 举报
回复
是这样的,
tmrec = packed record //避免字长对齐
你有何问题

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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