还有个问题,怎么没写上?
1>如何编写多线呈的serversocket,细节是什么?或在何处可以找到?

解决方案 »

  1.   

        每个TClientSocket和TServerSocket建立一次连接时,就获得一对唯一的IP和Port,remoteAddress和remoteport指的就是这里的IP和Port了。通过这一对数据信息,可以判断和区分各个连接。要保证不丢包,需要对每个数据包进行报文格式定义,当包尚未接收全时,要继续接收,直到收到报文的终止标志为止。
      

  2.   

    如果一个ip上连上来好几个client,那么她们所有的remoteaddress,remoteport都一样,
    区分不开,我发现remoteaddr.sin_port加上remoteaddress就可以,但我不太明白.
      

  3.   

    为什么没人回答,是不相信分吗,君子一言驷马难追,回答出一道50分,不会大家
    对此问题不屑一顾吧,如果你想编写一个socket的server,这些问题都是要解决
    的.
      

  4.   

    既然如此,请用Api来实现好一些.
      

  5.   

    1>多线程SOCK最好用阻塞模式,在ACCEPT后开一新线程,
    while(!terminated){
       read(sock);
       write(sock);
    }
    2>最大连接数有系统决定,它应在IP协议栈中定义(我没有试过),估计在128或256等数中
    一个完整的TCP连接包括(本地IP,本地port,远程IP,远程port),而且不可能有二个连接具有相同的四元组。
    3>不可能,因为四元组唯一地定义了每一个连接,两个客户一定是不同的四元组
    丢包的情况:
    TCP是不会丢包的。
    UDP可能丢包,但一般在局网中也不会丢包,除非你不去读SOCKET
    4>ICS,INDY,去www.torry.ru肯定能找到
    5>绝对有这种可能
      

  6.   

    用CSocket也可以,它本身就是阻塞的(其实看看它的定义就知道了其原理)
    最重要的是定义的数据结构,还有自定的缓冲区,还有一些情况是要同步的,请注意
      

  7.   

    1、4的答案和sundayhews一样
    2:sin_port是标准socket结构里的定义。一般你没必要去使用。
    3:这个是重点。我曾经作过测试,不同的客户连接在OnClientRead里是不会串的(有事件就一定是非线程方式),实际上OnClientRead的SOCKET参数对不同的客户是不同的。但是同一个客户的READ、OPEN、CLOSE事件则有可能会串,我让客户机不断去连接、断开服务器,一连通就马上发数据,这样用不了几次就会出错。所以这种方式有很大的漏洞,还是block的好。
    5:你肯定要加同步处理。当然不一定要用临界区,这要看你怎么用了。有很多方法的。
      

  8.   

    socket编程,ClientSocket与ServerSocket
    之间要自行定义一个通讯协议,也就是一个通
    讯命令很重要,格式举例如下:
    引导串,命令长度,命令串,参数个数,参数等互相之间按此格式交换数据, 你要自行编程分
    析这些命令;
    我正在研究这个问题,解决后再发贴子,我喜欢
    异步方式通讯,但有一些问题要解决;
      

  9.   

    to BCB
      自行定义和分析协议是非常简单的另外,的确可能在一次read里收到几个完整的包,这里要稍加处理。我还没有碰到收包不完整的情况,在JAVA里碰到过。不知道大家有什么看法。我觉得这个保证机制应该是由TCP层提供的,否则,那可是个很麻烦的事情。
      

  10.   

    回答第二个问题:区分连接是用sockethandle,即serversocket.socket.connections[i].sockethandle.用ip地址是不对的。
    第三个问题:用区分连接的方法来区分每个客户发来的包。包当然有可能丢失,那是由于网络的问题,最好先测试一下网络。
      

  11.   

    多线程Socket通讯是采用阻塞的办法,
    一个线程在通讯的时侯, 其它线程
    能同时通讯吗?如果一个线程通讯过程中
    出现故障,其它线程会不会受到影响?
       
      

  12.   

    从前4个问题看出你对socket的了解很粗浅, 关于一个套接字的5大组成部分并没有理解.
    建议你先读一读关于TCP/IP的基础书籍.
    至于同步, 是必须的, 你采测试的时候设置断点是会自动同步各线程的, 不信你不要调试,
    运行看看, 很有可能出错.
      

  13.   

    看了以上回答,觉得还是有些问题
    1》SOCKETHANDLE是能区分永久连接中的客户端,但是不能区分非永久连接中的客户端
    举个例子,第一个客户连上来他的SOCKETHANDLE是40,尔后断开,第二个客户端连上来,
    注意,他的SOCKETHANDLE也是40,这肯定区分不了这两个客户。DELPHI的SOCKETHANDLE
    有个规律:40,48,54,58,................
    2》一个线程不停的从TStringlist.item[0]读,一个线程不停的调用TStringList.ADD(S)
    我做过测试,没问题,不需要同步,因为一个从头读,一个在尾上加,为什么同步是必需的,不要
    想当然,看来你对同步了解也很粗浅
    3》那个四元组无法区分,不要讲什么tcp/ip,网络原理我早就考完了,注意一下实际问题,和书本并不完全一样,我做过测试,Remoteaddress与RemoteAddr.sin_port能区分非永久连接的客户端,有人能解释sin_port什么含义,为什么每次连接都不同吗?
      

  14.   

    to CKEN(2000-12-21 17:16:00) 1.非永久性的连接,你只能根据他的地址来区分。你可以在连接后立刻取得他的地址。连接时回自动启动一个SOCKET,他的HANDLE是个THANDLE类型,THANDLE等价于INTEGER,4字节长。断开时该SOCKET回自动释放,因此回出现你提到的情况。
    2
    3。sin_port是端口,端口和IP地址一起组成唯一协议地址。