说是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是否正确?希望高人伸一把手.

解决方案 »

  1.   

    是这样的,
    tmrec = packed record //避免字长对齐
    你有何问题
      

  2.   

    致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;
         我这样用有问题吗?
      

  3.   

    致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.
    我搞不懂为什么。
      

  4.   

    你的socket没有建立连接。
    你可以看看delphi的chat Demo看看他是如何做的
      

  5.   

    致kxy:
        有一点应该肯定,我的socket的连接绝对建立了.因为我上面的程序就是用于serversocket的onclientconnect事件和onclientread事件的,如果连接没有建立,就不会执行到这语句,也不会触发异常.
        我清楚socket error codes 10057的含意,就是因为和事实冲突,我才搞不清楚的.如果客户端以sendtext方法发送字串,而服务端以receivetext方法接收,那么一切ok,但是使用我现在用的方法就是有问题,真是不明白怎么回事,所以我才怀疑我的句法是否正确.但我要交换的是个数据结构,又不能用sendtext的方法,真头疼!你有什么好办法?
      

  6.   

    我改了一下Delphi的Chat Demo
    用SendStream和ReciveBuf,发送和接收一个结构运行正常。
      

  7.   

    致kxy:
        是的,刚才我也做了个同样的实验,用SendStream和ReciveBuf发送和接收一个结构时一切正常,我估计问题还是出在我的语句运用上,我再仔细找找毛病,谢谢你为我做的分析。