我是在delphi下用WinSock建立套接字进行通信。我的程序是用来接收别人发过来的数据,并有返回数据。在进行通信时我创建一个线程来完成接收和发送的。现在我需要把我的程序改成可以向另外一台机器建立连接而向其发送数据,我又创建一个发送的套接字线程,可是我需要发送的数据在另一个线程里。现在我遇到的问题是:1.我怎么从另一个线程中把要发送的数据取出来?2.我怎么保持同步,即在我另一个线程收到数据的同时把这些数据在另一个线程中发出去?不胜感激!!!!

解决方案 »

  1.   

    我现在遇到的问题是:我是用UDP方式通信,我接收一个地址的数据再把我收到的数据转发出去,转发是指定主机地址和端口号的,若指定的主机连接上的话通信较正常,但是若连接不上我指定的主机时(问题来了),发送会有一个连接失败(10060)并且在这个地方会滞留几秒中,这可是致命的。我怎么解决即使连接不上主机,但是不出现滞留几秒的,也就是立即就过去
      

  2.   

    最开始的问题:
    一般的做法是使用:在转发的线程里面,用AllocateHWnd让系统分配个窗口句柄,把这个HWND的值告诉另外的那个服务线程.
    当服务线程收到数据的时候,就给这个HWND的窗口发个消息,告诉转发线程,数据来了.
    至于数据怎么传递,如果有具体的协议,可以定义个结构,消息里面的WPARAM或LPARAM传递结构的指针.
    第二个问题:
    udp需要连接吗?直接sendto就行啦
      

  3.   

    既然你选择了UDP,那么就不能保证数据的完整性。
    收到之后就sendto不就可以了,缓冲区你要设定好大小,一旦达到最大值,你就直接清空缓冲区(再说sendto的速度并不比接收的速度差)。
      

  4.   

    先保存在缓冲里,接收好数据后发送event到发送数据的线程,否则让发送线程等待(直到超时或退出)
      

  5.   

    可能我说的情况还不够具体吧,总觉得答案不很符合(或许答案是正确的)。现在问题解决的差不多了,就是我用Winsock转发给一个不同网段的IP地址,例如主机IP为192.168.10.9,要发给远程的IP:172.18.1.9(我是随便设的),现在我在主机IP属性里选高级加了一个IP:172.18.1.4,然后远程和主机通过网段172.18.可以ping通了,然后我就向远程发送数据,可是远程现在根本收不到。这个问题怎么解决,还请各位高手给个指示,非常感激!!!
      

  6.   

    没看明白你写的
    你说收不到数据,我估计你是用的UDP协议(因为一般用TCP的话是先连接了才才发数据);
    如果接收端在NAT之后需要做个映射,如果做了映射还没收到;那就试试关闭防火墙了。
      

  7.   

    问题解决了,就是给哪个网段上发需要把该网段的本地Ip bing一下。谢谢各位的帮助,散分啦。