说是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是否正确?希望高人伸一把手.
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是否正确?希望高人伸一把手.
tmrec = packed record //避免字长对齐
你有何问题
抱歉,我定义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;
我这样用有问题吗?
异常信息:**.exe raised exception class ESocketError with message 'windows socket error'(10057),on API 'rec'.process stopped.
winsock error codes 10057应该为:Socket is not connected.
我搞不懂为什么。
你可以看看delphi的chat Demo看看他是如何做的
有一点应该肯定,我的socket的连接绝对建立了.因为我上面的程序就是用于serversocket的onclientconnect事件和onclientread事件的,如果连接没有建立,就不会执行到这语句,也不会触发异常.
我清楚socket error codes 10057的含意,就是因为和事实冲突,我才搞不清楚的.如果客户端以sendtext方法发送字串,而服务端以receivetext方法接收,那么一切ok,但是使用我现在用的方法就是有问题,真是不明白怎么回事,所以我才怀疑我的句法是否正确.但我要交换的是个数据结构,又不能用sendtext的方法,真头疼!你有什么好办法?
用SendStream和ReciveBuf,发送和接收一个结构运行正常。
是的,刚才我也做了个同样的实验,用SendStream和ReciveBuf发送和接收一个结构时一切正常,我估计问题还是出在我的语句运用上,我再仔细找找毛病,谢谢你为我做的分析。