×

Loading...

Topic

This topic has been archived. It cannot be replied.
  • 工作学习 / IT技术讨论 / 我有一个有关SOCKET的问题请各位搞通信的兄弟赐教:如果在一个IP上有两个CLIENT和同一SERVER通信,这两个CLIENT的IP和TCP PORT都一样,会不会出现接受到SERVER数据混乱的情况?为什么?
    • 是否混乱取决于你编程了,因为两个client的IP和TCP port 都一样,所以一定要有一个不同的变量可以用于区分两个client, 这实际上等于你发的TCP包里又多了一层子包,意思就说到这儿了,挺乱的,你不明白我也没办法
      • C的SOCKET我没试过,JAVA我没有做任何编程上的考虑,不会混乱。为什么?
        • 很简单,你的TCP的data里留一个字节用来区分两个client不就行了吗
          • 我是说在JAVA编程里我没有做任何的改动也没有问题,奇怪是吧?
            • Java我不熟,但感觉应该是两个client都收到了同样的包(包括应发往另一个client的包),是否是因为你程序里各自期待的数据不同自然过滤掉了?
      • 我是说你的数据包里
        • 九兄这几天都在忙什么呀
    • The server end should be Multi-Thread program
      • 你试过吗?
        • 我是说JAVA 的SERVER SIDE的SOCKET可以是单线程的
        • I wrote HTTP, FTP, SMTP, POP, Socks 4/5, Proxy server before
          • 那怎么区别不同CLIENT 的呢?
            • Are you the guest asked for help? The sever end creats thread for each client, thats it
              • 是但SERVER的THREAD怎么知道自己连的是哪一个CLIENT呢?处了IP,PORT还要用老九说的办法吗?如果不用似乎没有别的措施呀?
    • 不同的会话当然不会乱了!发包方有地址,接收方也有地址呀!不是发给它的包它不会理的 ...
      • 你说的SESSION 是指什么,能不能具体一点?
    • 我是指client端发起一个请求,服务器会返回一个带地址的响应(非常具体的地址,指明为其服务的具体实体[可能是个线程,也可能是独立的进程]),这样一个会话是不会乱的,明白吗? ...
      • 服务器端的进程或线程之间是绝对不会混的,java应该是由VM自动管理多线程,所以你不用编程实现(我这么理解)...
      • 你说的是JAVA吗?你如何知道:一个带地址的响应?
    • 我怎么觉得这种情况不会发生. 当一个client bind到一个port上之后, 如果另一个client想bind到相同的port, kernel就会给出错误信息, 说该port已经被占用, 无法bind.
      TCP/IP是在kernel里面的, 至少在unix上是这样. Or am I missing something?
      • 至少我试过JAVA的MULTI-THREAD的SOCKET,可以这样做的,没有问题。
        • 更有趣的是所有的SERVER的THREAD和CLIENT都在同一台机上用同样的IP和PORT!!!
          • CLIENT/SERVER只用一对IP,PORT(如127。0。0。1:7070),由PROGRAMMER定义不一定要WELL KNOW PORT。
      • 子线程会继承父进程的资源,如FILE,SOCKET descriptor。
        • FILE 和DESCRIPTOR应该有东西能鉴别对方(CLIENT)的DESCRIPTOR
        • That's how server works. But my understanding of what he is saying is that 2 independent client process can use the same TCP port, which I don't think possible.
          • 你都无法解释哪怕只有一个CLIENT,CLIENT和SERVER THREAD用同一IO/PORT的情况!
            • SORRY 是CLIENT 和SERVER 在同一机上用同一 IP/PORT。
              • That is not possible. How did you know they are using the same IP/port? Post your result of "netstat -a -n -f inet" please. Also, which OS are you using?
                • 一个JAVA SOCKET程序,我可以自己定义CLIENT/SERVER的IP/PORT 同时运行多个CLIENT和一个SERVER。
                  • You can define in your program doesn't mean you can run it. Please post your result of "netstat -a -n". I will believe you until I see it.
                    • 看来是遇到高人了请进,(我是用127。0。0。1和7771)CONSTRUCT的SOCKET(包括C/S)
                      TCP 0.0.0.0:7771 0.0.0.0:0 LISTENING
                      TCP 0.0.0.0:3796 0.0.0.0:0 LISTENING
                      TCP 127.0.0.1:7771 127.0.0.1:3796 ESTABLISHED
                      TCP 127.0.0.1:3737 127.0.0.1:7771 TIME_WAIT
                      TCP 127.0.0.1:3738 127.0.0.1:7771 TIME_WAIT
                      TCP 127.0.0.1:3739 0.0.0.0:0 LISTENING
                      TCP 127.0.0.1:3796 127.0.0.1:7771 ESTABLISHED
                      UDP 127.0.0.1:3739 *:*
                      • 进一步报告
                        SERVER启动前
                        TCP 127.0.0.1:3739 0.0.0.0:0 LISTENING
                        UDP 127.0.0.1:3739 *:*

                        SERVER启动后
                        TCP 0.0.0.0:7771 0.0.0.0:0 LISTENING
                        TCP 127.0.0.1:3739 0.0.0.0:0 LISTENING
                        UDP 127.0.0.1:3739 *:*
                        client 运行后

                        TCP 0.0.0.0:7771 0.0.0.0:0 LISTENING
                        TCP 0.0.0.0:3819 0.0.0.0:0 LISTENING
                        TCP 127.0.0.1:7771 127.0.0.1:3819 ESTABLISHED
                        TCP 127.0.0.1:3739 0.0.0.0:0 LISTENING
                        TCP 127.0.0.1:3819 127.0.0.1:7771 ESTABLISHED
                        UDP 127.0.0.1:3739 *:*
                        • well...it's quite normal...On a port, there can be mutiple in-bound connection while there can be only one out-bound connection...
                      • I'm no Gao Ren, in fact, I'm a freshman, a stubborn one. :-) Anyway, I have to go to sleep now. Nice chatting with you guys.
                        • 等一等,还是有问题,见上贴
                          • OK, those entries with ESTABLISHED keyword indicate established connections. In those entries, c/s ports cannot be the same, which is indicated in your result.
                    • client 不用PORT bind() ;
                      • But client has to use a port, right?
                        • used for find the correct server process. the port = a server process
                          • From unix-socket-faq:
                            It has been pointed out that "A socket is a 5 tuple (proto, local addr, local port, remote addr, remote port). SO_REUSEADDR just says that you can reuse local addresses. The 5 tuple still must be unique!"
              • 呵呵,port只对SERVER端process而言,client端PROCESS 建立SOCKET后,不用BIND(),用WELL KNOWN PORT 建立CONNECTION 就可以READ()AND WRITE()了
      • agree with u
    • 无论是JAVA还是C的SOCKET编程,SERVER端都是以不变应万变,即在WELL KNOWN PORT ACCEPT 来自任何CLIENT端的CONNECTION请求,随即在子线程中用新分配的唯一新SOCKET与唯一对应的CLIENT通信,这是个原则,需要编程实现
    • 不会!这仅仅是一个端口复用的技术......
      首先,我对WINDOWS不熟,从来没编过程,不知道,但是端口复用对于UNIX来讲是easy的一件事,但是每一个TCP/IP连接的流句柄是唯一的。你可以参见11月13日我贴的文章:socket编程

      一般来讲,在client和server端建立连接的过程如下:
      SERVER CLIENT

      socket socket
      | |
      bind |
      | |
      listen connect
      | 请求连接 |
      | <-------------- |
      accept |
      | 响应连接 |
      | --------------> |
      read <---------- write
      | |
      write ----------> read
      | |
      close close

      Server端每次执行以上过程socket会返回一个句柄,然后绑定一个端口(在bind函数中),在accept函数中,每建立一个连接,accept返回一个新的唯一句柄(!!!),以后的read和write均试用这一个句柄进行读写。这样,一个端口可以建立多个连接。
    • 我的妈呀,这么简单的问题还有这么多讨论.
    • after I saw all the response I know how u guys can't find a good job. so stupid. the socket address is composed of (serverIP,server Port,client Ip,Client Port), so how could u got a mess?
    • No problem.
      whenever the server reveive a request, it will throw a new thread or process to handle it.

      eg, you can ping a server from one station N times.
    • 不会搞混的!怎么搞得这么复杂?想象在同一台client上FTP或Telnet到同一台server上的情况就行了。嘿嘿。