如果不相同,我怎么区别这些accept后的socket呢?(就是那些Sockets句柄吗?)
还有就是accept最多能产生多少个sockets(限制于系统和网络性能吗?)
我基本上查看过以前同志们(相关)的帖子,我想大家帮我验证一下我的看法对不?或发表一下经验。谢谢。

解决方案 »

  1.   

    肯定不同啊,Listen套接字,只有一个,只是负责监听,如果有客户的连接请求就分配一个Socket缓冲区,用来和客户通信。下面是我以前做的一个聊天程序的服务器代码。
    #include "winsock2.h"
    #include "stdio.h"
    int numServed=0;
    SOCKET clisocket[100];
    SOCKET init(u_short port);
    struct ARG
    {
    SOCKET fd;
    sockaddr_in ip;
    char clientname[100];
    };
    void process_client(LPVOID lpv);
    void process_send(LPVOID lpv);
    void main()
    {
    ARG arg;
    int size;
    SOCKET listenfd,acceptfd;
    int numServed2=0;
    struct sockaddr_in client;
    HANDLE handle1[100],handle2[100];
    unsigned long myid1,myid2;
    size=sizeof(client);
    listenfd=init(8001);
    listen(listenfd,1);
    printf("Listen in 8001.\n");
    while(numServed<100)
    {
    acceptfd=accept(listenfd,(sockaddr *)&client,&size);
    arg.fd=acceptfd;
    arg.ip=client;
    clisocket[numServed]=acceptfd;
    //process_client(acceptfd,client);
    handle1[numServed]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)process_client,(LPVOID)&arg,0,&myid1);
    if(handle1[numServed]=NULL)
    printf("Failure!");
    handle2[numServed2]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)process_send,(LPVOID)&arg,0,&myid2);
    if(handle2[numServed2]=NULL)
    printf("Failure!");
    numServed++;
    numServed2++;
    }
    }
    SOCKET init(u_short port)
    {
    SOCKET listenfd;
    struct sockaddr_in server;
    WSADATA WSAdata;
    WSAStartup(MAKEWORD(2,1),&WSAdata);


    listenfd=socket(AF_INET,SOCK_STREAM,0);
    server.sin_family=PF_INET;
    server.sin_addr.S_un.S_addr=INADDR_ANY;
    server.sin_port=htons(port);

    bind(listenfd,(struct sockaddr *)&server,sizeof(server));
    listen(listenfd,5);
    printf("server running! listen on %d\n",port);
    return listenfd;
    }
    void process_client(LPVOID lpv)
    {
    char buf[100];
    int i;
    sockaddr_in client;
    struct ARG *arg;
    arg=(ARG *)lpv;
    SOCKET acceptfd=arg->fd;
    client=arg->ip;
    memset(buf,100,0);
    if(acceptfd==INVALID_SOCKET)
    printf("Error:accept failed\n");
    while(1)
    {
    if(recv(acceptfd,buf,sizeof(buf),0)==-1)
    {
    printf("the client has leave!\n");
    break;
    }
    printf("%s says:",inet_ntoa(client.sin_addr));
    printf("%s\n",buf);
    if(strcmp(buf,"bye")!=0)
    {
    for(i=0;i<numServed;i++)
    {
    printf("Send to %i\n",i);
    send(clisocket[i],strcat(strcat(inet_ntoa(client.sin_addr),":"),buf),100,0);
    }
    }
    else
    {
    break;
    }
    }
    //send(acceptfd,buf,sizeof(buf),0);}
    void process_send(LPVOID lpv)
    {
    char sendbuf1[100];
    char b[100]="服务器对所有用户说:";
    int a;
    struct ARG* accept_sd=(struct ARG*)lpv;
    while(1)
    {
         memset(sendbuf1,0,sizeof(sendbuf1));
         gets(sendbuf1);
            for(a=0;a<numServed;a++)
    {
    send(clisocket[a],b,100,0);
             send(clisocket[a],sendbuf1,100,0);
    }
    }
    }
      

  2.   

    tcp的socket是由客户端和服务器端双方确定的,即((ip,port),(ip,port))对。
    端口是相同的,如果不同,接收不到。
    是accept最多能产生多少个sockets与操作系统有关。
      

  3.   

    我说的端口相同是指服务器的端口相同。
    由于客户端的ip或者端口不同,所以socket不同。
      

  4.   

    to jackwuwei(吴羡鱼) 
    你说什么不同?是accept后得到的socket的端口和Listen的端口不同吗?to broadoceans(broadoceans)
    我同意你的看法,即“套接字对”不同。
    但jackwuwei(吴羡鱼) 可能说accept后得到的socket的端口和Listen的端口相同啊。肯定这点后我马上结贴,谢谢。
      

  5.   

    accept
    If no error occurs, accept returns a value of type SOCKET that is a descriptor for the new socket. This returned value is a handle for the socket on which the actual connection is made.至于多少个那就看系统支持了
      

  6.   

    我怎么区别这些accept后的socket呢?(就是那些Sockets句柄吗?)就用socket句柄来区分,因为它对应一个连接,即套接字对。
    其中服务器端的ip和port不会改变。因为你发送消息的时候,只用socket句柄就可以了,正说明了这一点。
      

  7.   

    端口是相同的, accept后并没有出现新的端口。
      

  8.   

    不同吧!试试看!可以用getsocketname得出来看看先!
      

  9.   

    端口不一定要相同,其实你可以这样想象:把服务端的Socket想成一个电源插线板,而accept后的Socket相当与插线板上的一个插座,客户端的Socket就相当与外来设备的电源插线头了.
    :)
      

  10.   

    一样!我已经用getsocketname看了!
      

  11.   

    我试也是一样的,两个不同的套节字完全可以使用同样的 IP 和 PORT, 它们应该是有不同的收发缓冲区的。