server端每次接收一个客户端连接之后应该开启一个线程(将新的socket传给它)为客户端服务直至结束

解决方案 »

  1.   

    推荐你先看书: <TCP/IP网络互联技术 卷III>winsock版。
    第8章: 服务器软件设计的问题。看完就明白了。
      

  2.   

    服务器要不断地m_sListenSocket.Accept(m_sConnectSocket)来接收连接还是先看看TCP/IP协议吧, 看看连接的三次握手
      

  3.   

    看看《TCP/IP详解》,注意分配好PAIR SOCKET。
      

  4.   

    http://www.csdn.net/expert/topic/737/737424.xml?temp=.5668909
      

  5.   

    好难呀,说实话,我才学习vc不到三个月的时间,我看了那个地址的内容了,大体的意思我能明白一些了,但是关于多线程编程我真的不太通,也许你们会笑我真的是个白痴,但没办法,人学习新东西都要经过这个过程的,我的时间很少了,你们能不能再帮我想想有没有什么好的办法能实现这个功能的?谢谢了,不胜感激!!!对了,哪里能载到《vc++技术内幕》电子版的?
      

  6.   

    服务器端应该建立两个Socket对象,一个用于监听,另一个用于收发信息,这样就可以了连接多个客户端了,进行异步通信。
    推荐网址:
    http://home.qianmen.com.cn/vcmanor/netdoc.asp
      

  7.   

    客户端的m_sConnectSocket.Create(4000);
    在多次调用时,会有多个socket bind到4000端口,所以除了第一次成功,后面的都会失败的。
    改为m_sConnectSocket.Create(0);就可以了
      

  8.   

    对于只有先启动服务器才能进行连接,是因为你的服务器接收到连接以后就停止了,你应该在服务器端创建一个线程专门用于listen监听连接请求,当接收到一个连接后,新建一个线程与一个客户端accept建立连接。
      

  9.   

    服务器端用两个SOCKET类,一个等待连接,另外一个是和客户端对应的,客户端每来一个连接信号,则在连接里追加一个对象
      

  10.   

    写个代码给你试试:
    服务器:
    #define FD_SETSIZE 4
    #include <winsock2.h>
    #include <windows.h>
    #include <cstdio>
    #include <cstdlib>
    //#include "debug/cppmg.hpp"
    //#include "debug/cobj.cpp"
    //#include "multithread.h"
    #include <cassert>
    #define countof(x) (sizeof(x)/sizeof(x[0]))
    #pragma comment(lib,"ws2_32")
    #include <process.h>
    typedef unsigned (__stdcall *pThreadFun)(void *);
    typedef DWORD (__stdcall *pThreadFun1)(void *);
    __inline HANDLE ThreadCreate(pThreadFun1 threadAddress,LPVOID pParm=NULL,DWORD flag=0,LPDWORD pctx=NULL)
    {
     DWORD ctx;
     return (HANDLE)_beginthreadex(NULL,0,(pThreadFun)(threadAddress),(pParm),(flag),(UINT*)(pctx? pctx:&ctx) );
    }
    __inline HANDLE ThreadCreate(pThreadFun threadAddress,LPVOID pParm=NULL,DWORD flag=0,LPDWORD pctx=NULL)
    {
     DWORD ctx;
     return (HANDLE)_beginthreadex(NULL,0,(pThreadFun)(threadAddress),(pParm),(flag),(UINT*)(pctx? pctx:&ctx) );
    }
    #define ErrorMsg printfDWORD __stdcall TransmitThread(LPVOID parm)
    {
           SOCKET s=pram;
           char buffer[4096];
           int nRead
           while((nRead=recv(s,buffer,4096,0))>0)
           {
                  buffer[nRead]=0;
                  printf("%s",buffer);
           };
           closesocket(s);
           return 0;
    }void main(int argc,char** argv)
    {
    if(argc<2)
    {
    ErrorMsg( "Usage\n"
    "\tSockSvr localport \n");
    return;
    }
    SOCKET s;
    WSADATA wsd; int port1;
    port1=atoi(argv[1]); if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
    {
    ErrorMsg("WSAStartup failed\n");
    return;
    }
    s=socket(AF_INET,SOCK_STREAM,0);
    if(s==INVALID_SOCKET)
    {
    ErrorMsg("Create socket failed %d\n",WSAGetLastError());
    return;
    }
    sockaddr_in addr;
    memset(&addr,0,sizeof(addr));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(port1);
    addr.sin_addr.S_un.S_addr=INADDR_ANY; if(bind(s,(SOCKADDR*)&addr,sizeof(addr)))
    {
    ErrorMsg("Failed to bind socket %d\n",WSAGetLastError());
    return;
    } while(1)
    {
    listen(s,5);
    sockaddr_in inaddr;
    int sz=sizeof(inaddr);
    SOCKET s1=accept(s,(SOCKADDR*)&inaddr,&sz);
    CloseHandle(ThreadCreate(TransmitThread,(LPVOID)s1));
    }
    WSACleanup();
    };
    客户端就不写了,你在本机运行服务器后自己用telnet localhost port试吧
    比如
    服务器:(机器名server)
    socksvr 8080
    客户端运行
    telnet server 8080然后客户端输入在服务器端应该可以看到
      

  11.   

    Create(4000)的问题
    改用Create(0)
    Windows会自动分配空闲的端口
      

  12.   

    用Create(0)我试过了,不行的!不知道什么原因!