请高人帮我看看,我在delphi中写这样的winsock程序能支持多用户连接吗?也就是多用户同时连接服务器。会不会出现,一个用户连接上时,别人用户就无法连接上服务器的情况。如果会,那我应该怎么解决呢??     很急,分可以再加,真的,拜谢各位了   我听说,应该是accept后新建一个socket这样,就相当如一个web server,支持多用户同时连接了。
  //2.初始化客户端结构
    fillchar(server_addr, sizeof(server_addr), 0);
    //2.1  端口
    server_addr.sin_family := AF_INET;
    server_addr.sin_port := htons(WarnListenPort);  //WarnListenPort是int型的端口号
    //2.2  主机IP
    server_addr.sin_addr.S_addr := inet_addr(Pchar(WarnServerIP));
    if server_addr.sin_addr.S_addr = INADDR_NONE then
    begin
      ShowMessage('初始化出错,绑定IP地址非法!');
      exit;
    end;
    //3.创建SOCK
    Warn_Sock_Accept := socket(AF_INET, SOCK_STREAM, 0);
    if (Warn_Sock_Accept = SOCKET_ERROR) then
    begin
      ShowMessage('初始化出错,无法创建SOCK!');
      exit;
    end;    //4.绑定
    if (bind(Warn_Sock_Accept, server_addr, sizeof(server_addr)) <> 0) then
    begin
      showmessage('初始化出错,无法绑定!');
      exit;
    end;
    //5.监听
    if (listen(Warn_Sock_Accept, 5) <> 0) then
    begin
      showmessage('初始化出错,无法监听!');
      exit;
    end;    while (true) do   //死循环,不停的接收
    begin   
      i := sizeof(client_addr);
      fillchar(client_addr, i, 0);     
      ns := accept(Warn_Sock_Accept, addr(client_addr), addr(i));
      if ns=-1 then
        begin
       //  mainform.Memo1.Lines.Add('程序监听出现错误,请重起程序!');
         application.Terminate;
         exit;
        end;      fillchar(rbuf, sizeof(rbuf), #0);
      recvlen:=recv(ns,rbuf,sizeof(rbuf),0) ;   //接收数据。
      if recvlen>0 then
       begin
        mcumsg:=copy(rbuf,0,recvlen);
        synchronize(parsemcumsg);       //做相应的处理
       end;
      closesocket(ns);
     end;

解决方案 »

  1.   

    代码没细看,当clientsocket 连接不同的serversocket时,clientsocket.connect(x,1)后面的1代表你连接那个serversocket,serversocket根据侦听客户端的连接请求,创建不同的server就可以了
      

  2.   

    delphi的传统控件TServerSocket不就可以实现了嘛?为什么自己写代码阿
      

  3.   

    有DELPHI自带的TServerSocket就成了!
      

  4.   

    要实现多用户连接就用多线程或者线程池啊,为每个连接上的用户创建一个线程,有个API:CreateThread(),MSDN上有详细的介绍.用delphi的TServerSocket,如果用阻塞式的话就是多线程的,如果用非阻塞的话就不是了,要自己去创建线程.
      

  5.   

    呵呵。。你那程序当然能支持多用户同时连接,,可是。。它根本不会接收SOCKET数据!
        while (true) do   //死循环,不停的接收
        begin   
          ns := accept(Warn_Sock_Accept, addr(client_addr), addr(i));//侦听线程会停在这儿侦听,来一个连接才会执行下去。

          recvlen:=recv(ns,rbuf,sizeof(rbuf),0) ;   //它是在侦听线程同一线程,前面等待着的,它怎么可能运行到。

          closesocket(ns);
         end;--------------------------
    accept后,为连接创建线程去传输数据,这是最基本做法。
      

  6.   

    你这样的做法是不能够支持socket多用户的连接的
    要做到多用户连接就必须为每一个连接进来的用户还一个单独的线程,并且从新分配一个新的端口。
    1 如果你一定要用api来写的话,就要用线程数组,去看看线程池的例子吧。
    2 可以使用indy的控件,里面好像有个Tthreadpool控件的,很方便