我要用AS3和C++进行SOCKET通讯,这两天刚看C++,好不容易弄好了可以通信,但是问题来了:这个服务端代码只能接受一个用户的信息。
如何改动使它可以接受多个用户的连接和互发信息。
(我的这个代码应该是循环判定一个已连接的用户的发送过来的信息而无线卡在这里,)我只要求弄个最简单的1个服务器与多个用户进行互发信息的服务端代码。求帮我改动下 谢了!
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
void main()   
{    
    WORD wVersionRequested;   
    WSADATA wsaData;   
    int err;   
    short port=9000;//端口号   
    wVersionRequested = MAKEWORD( 1, 1 );   
    err = WSAStartup( wVersionRequested, &wsaData );//初始化套接字   
    if ( err != 0 )   
    {   
        return;   
    }   
    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )   
    {   
        WSACleanup( );   
        return;   
    }   
    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字   
    SOCKET sockConn;//用来和客户端通信的套接字   
    SOCKADDR_IN addrSrv;//用来和客户端通信的套接字地址   
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);   
    addrSrv.sin_family=AF_INET;   
    addrSrv.sin_port=htons(port);   
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//绑定端口   
    listen(sockSrv,50);//侦听   
    printf("服务器 %d 正在监听......\n",port);
    SOCKADDR_IN addrClient;   
    int len=sizeof(SOCKADDR);   
    char buf[4096];//接收的数据   
    char rbuf[100]=   
        "<cross-domain-policy> "     
        "<allow-access-from domain=\"*\" to-ports=\"9000\"/>"     
        "</cross-domain-policy> ";//套接字策略文件   
    printf("开启?");
    while(1)
    {   
printf("什么情况");
        //接受连接   
        sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
        printf("接收连接来自 %s\n",inet_ntoa(addrClient.sin_addr));   
           
recv: printf("循环\n");
        //接收数据   
        int bytes;   
        if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR)   
        {   
            printf("接收数据失败!\n");   
            exit(-1);   
        }
  
        buf[bytes]='\0';   
        printf("接收信息(%s: %s\n",inet_ntoa(addrClient.sin_addr),buf,")");        
        if (0 == strcmp(buf,"<policy-file-request/>"))   
        {   
            //发送数据   
            if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR)   
            {   
                printf("发送数据失败!");   
                exit(-1);   
            }
            printf("发送到 %s: %s\n",inet_ntoa(addrClient.sin_addr),rbuf);   
        }   
        else  
        {   
            //Echo   
            if(send(sockConn,buf,strlen(buf)+1,0)==SOCKET_ERROR)   
            {   
                printf("发送数据失败!");   
                exit(-1);   
            }
            printf("已发送信息( %s: %s\n",inet_ntoa(addrClient.sin_addr),buf,")"); 
            goto recv;   
        }   

        //清理套接字占用的资源
printf("清理资源");
        closesocket(sockConn);   
    }   
}socketc++服务器

解决方案 »

  1.   

    http://download.csdn.net/download/lonelyhaisong/1073190
      

  2.   

    可以用多线程方式:while(1)
    {
       ...
       sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
            printf("接收连接来自 %s\n",inet_ntoa(addrClient.sin_addr)); 
       CreateThread(...)//当接收到客户端地址时创建线程,参数是收到的客户端的socket和IP地址。
       ...
    }
    DWORD WINAPI ThreadProc(
      LPVOID lpParameter   // thread data
    );
    {...
     //1>向客户端发送数据。
     //2>关闭连接此客户端socket
     ...
    }
    大体就这样,有啥不懂再说!
      

  3.   

    通过Accept接收建立连接后,把SOCKET保存到一个链表中,然后通信的时候从链表中找客户端绑定的SOCKET,发送数据
      

  4.   

    嗯,了解了一些关于线程的知识。
    还想问一下,如果100个人同时访问服务器,那么服务器就创建100个线程吗?这个跟CPU线程有什么关系?(我看CPU的什么都是线程4之类的不会只能4个吧?)
    那么多线程会不会造成非常卡?就是指效率问题
    因为我看到好像有什么单线程多用户,
    那么单线程多用户和多线程多用户那个效率比较高点?
      

  5.   

    你写个最简单的一对多的SOCKET程序感性认识一下先。线程的效率问题貌似可以讲得很深,如果确实是要求大数据多并发高性能,看看IOCP
      

  6.   

    这有很多socket例子,可以参考:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  7.   

    用select模型吧
    http://blog.csdn.net/yanheifeng715000/article/details/6592447
      

  8.   

    楼主,建议你去看下select模型。集成了一对多的功能。否则自己开多线程接收多麻烦
      

  9.   

    感谢大家,经过这几天努力,采用了IOCP,虽然是最简单的,不过至少比100个用户开100个线程强多啦。本帖结啦