本帖最后由 VisualEleven 于 2010-10-14 18:48:01 编辑

解决方案 »

  1.   

    #include <stdio.h>
    #include <Winsock2.h>
    #pragma comment (lib,"ws2_32.lib")
    int main()
    {
     WORD wVersionRequested;
     WSADATA wsaData;
     int err; wVersionRequested = MAKEWORD( 2, 2 );
     
     err = WSAStartup( wVersionRequested, &wsaData );
     if ( err != 0 ) {
     printf("建立套接字失败...");
      return -1;
     }
     
     if ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 ) {
      WSACleanup( );
      return -1;
     }
     SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
     addrSrv.sin_family=AF_INET;
     addrSrv.sin_port=htons(6000);
     int retval;
     retval=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
     if(SOCKET_ERROR==retval)
     {
        closesocket(sockSrv);
        printf("端口绑定失败");
        return -1;
     }
     printf("绑定成功开始监听...\n");
     listen(sockSrv,5); SOCKADDR_IN addrClient;
     int len=sizeof(SOCKADDR);
      char sendBuf[50];
     
      SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
     while(1)
     {
      
       
            printf("请输入要发送的内容:");
            scanf("%s",sendBuf);
      //sprintf(sendBuf,"服务端IP:%s\n连接成功!\n",inet_ntoa(addrClient.sin_addr));
     send(sockConn,sendBuf,strlen(sendBuf)+1,0);
       
      
      
     }
     closesocket(sockConn);
           WSACleanup();
     return 0;
    }
      

  2.   

    首先你要明白,要发送数据,就得建立socket的连接。
    你没有实时的检测accept(),因此 ,你的accept()只用了一回,当然只能和一个客户端链接了。while(1)
    {
    accept();createthread();
    }这样的思路才能和多客户端发送数据,还有的是,这仅仅是阻塞socket,因此实时检测基本就用线程来代替。异步的socket我也了解甚少,不过想必你也刚入门,多看看书吧,先把阻塞的弄明白了也算是入门了。
      

  3.   

    我会去学阻塞的 但是如何要同100个客户端链接的话那么不是需要100个线程吗??
    还有就是好像有意个  select() 让你可以同时监视多个套接字
    请问如何用??
      

  4.   

    自己顶 没有人马?
    有没有人会用 select()急求用法 小菜感激了!
      

  5.   

    csdn 的高手们求救了 select如何用才能同多个客户段 通话!
      

  6.   

    google一下,socket select模型一大把。。
      

  7.   

    SelectTime.tv_sec = 0;         /*秒*/
    SelectTime.tv_usec = 500000; //500ms  
    iSelNum = select(0, &fdread, NULL, NULL, &SelectTime );
    if ( 0 == iSelNum ) /*超时*/
    {
      continue; //Sleep( 1 );
    }

    这些在一个while循环里做,每次检查iSelNum 的值;iSelNum  == -1 为错误的;
    然后再对应的socket上应用recv函数接受消息;大致的思路就是这样的,具体细节看一下msdn;再有问题讨论!
      

  8.   

    把多个连接好的socket一次性加到set中,然后select,超时后或者有消息后,检查set中剩余的socket,依次处理之。
      

  9.   

    我彻底晕了为了交作业我还是用创造线程的方法吧?slect以后研究
    请问用这个createthread 如何创造线程??
      

  10.   

    select用法:
    SOCKET s;
    fd_set fdread;
    int ret;
    //创建套接字接受连接
    //在套接字上管理IO连接
    while(TRUE)
    {
       FD_ZERO(&fdread);
       FD_SET(s,&fdread);
       if(ret=select(0,&fdread,NULL,NULL,NULL)==SOCKET_ERROR)
       {
          //出错   }
       if(ret>0)
       {
          if(FD_ISSET(s,&fdread))
          {
             //套接字s上发生一个事件
          }
       }
    }
      

  11.   

    http://baike.baidu.com/view/1191444.htm
      

  12.   


    //循环接受客户的请求
        while(TRUE)
        {
            NewConnection = accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen);
            if(NewConnection == INVALID_SOCKET)
            {
                printf("Failed accept()\n");
                continue;
            }
            printf("Received a link: %s\n",inet_ntoa(ClientAddr.sin_addr));
            //向客户端发送信息
        
            printf("请输入向客户端发送的信息:\n");
            scanf("%s",szText);
            send(NewConnection,szText,strlen(szText),0);        //关闭同客户端的连接
            closesocket(NewConnection);
        }
      

  13.   

    我也在学习相关的内容,帮忙顶。
    顺便问一下,我这有台设备,我现在可以在不同的电脑上打开客户端去读取服务端(这台设备)的状态。而且在所有的客户端上都能实时的显示这台设备的状态。这样的TCP连接时阻塞式的还是非阻塞式的?有没有什么软件可以检测出是哪种连接方式吗?我想自己编一个客户端,采集并记录数据(原来的客户端功能太少)但是服务端是装在设备里,没办法查看的。现在只能去用第三方软件,去分析他们之间的通讯内容。