<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 303  文章 - 883  trackbacks - 0
    <2007年11月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    歡迎光臨! 
    閑聊 QQ:1074961813

    隨筆分類(357)

    我管理的群

    公共blog

    • n維空間
    • Email : java3d@126.com 群 : 12999758

    參與管理的論壇

    好友的blog

    我的其他blog

    朋友的網(wǎng)站

    搜索

    •  

    最新評論

    運行時,請先啟動服務(wù)器端

    /*
    * 服務(wù)器端
    */


    #include   
    <Winsock2.h>   
    #include   
    <stdio.h>   
    #include   
    <iostream.h> 
    #pragma comment(lib,
    "Ws2_32.lib")  
         
    SOCKET   sockSvc;
    //服務(wù)器端socket
    SOCKET   sockConnect;   //連接用的socket
        
    DWORD WINAPI RecvData(LPVOID   lpParameter);  
    //接收線程的函數(shù) 
        
    int main()   
    {   
      WORD   wVersionRequested;
    //定義socket1.1或者socket2.0   
      WSADATA   wsaData;   //定義裝載socket版本的變量
      int   err;   //錯誤變量
        
      wVersionRequested 
    = MAKEWORD(2,2);   //定義連接為socket2.0
        
      err  
    =  WSAStartup(wVersionRequested, &wsaData);   //裝載socket2.0支持
      if(0 != err)//判斷是否裝載成功
      {   
        
    return -1;   
      }
       

      
    if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)//判斷版本號,是否和定義的一樣
      {   
         WSACleanup();   
    //若出問題,卸載支持,并結(jié)束程序返回-1
         return -1;     
      }
       
        
      sockSvc 
    = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
      
    /*
      
        SOCKET WSASocket(int af, int type, int protocol,
                     LPWSAPROTOCOL_INFO lpprotocolinfo,
                     GROUP g, DWORD dwflags)

        SOCKET socket(int af, int type, int protocol)
        參數(shù):地址族,套接字類型和協(xié)議類型
              這三個因素共同決定了創(chuàng)建套接字的服務(wù)提供者
        
        傳輸服務(wù)提供者實現(xiàn)的功能包括建立連接,傳輸數(shù)據(jù),實現(xiàn)流控制和差錯控制等函數(shù)。
        Ws2_32.dll在應(yīng)用程序和服務(wù)提供者之間實現(xiàn)了媒介的功能

     
      第一
          socket()和WSASocket()函數(shù)都能返回一個SOCKET套接字;
          socket()主要實現(xiàn)同步傳輸,Socket庫中例程在應(yīng)用于阻塞套接口時會阻塞。
          WSASocket()用于異步傳輸,WSASocket()的發(fā)送操作和接收操作都可以被重疊使用。
          
          WSASocket()的接收函數(shù)可以被多次調(diào)用,發(fā)出接收緩沖區(qū),準(zhǔn)備接收到來的數(shù)據(jù)。
                     發(fā)送函數(shù)也可以被多次調(diào)用,組成一個發(fā)送緩沖區(qū)隊列。
          socket()卻只能發(fā)過之后等待回消息才可做下一步操作!
      其次    
          WSASocket()所支持的版本如下:   
                            Version:   Requires   Windows   Sockets2.0.   
                            Header:   Declared   in   Winsock2.h.   
          socket()所支持老一些的版本,如Windows   Sockets1.0和   
                            Version:   Requires Windows   Sockets1.1
      
    */

        
      SOCKADDR_IN  addrSvc; 
    //服務(wù)器地址信息 
      addrSvc.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //0 接收所有數(shù)據(jù)包  
      addrSvc.sin_family   =  AF_INET;   
      addrSvc.sin_port  
    =  htons(4000);//監(jiān)聽 端口
        
      bind(sockSvc,(SOCKADDR
    *)&addrSvc,sizeof(SOCKADDR)); //綁定服務(wù)和端口  
        
      listen(sockSvc,
    50);   
      
    /*
        int listen(SOCKET s, int users); 
        服務(wù)程序可以調(diào)用listen函數(shù)使其流套接字s處于監(jiān)聽狀態(tài)。處于監(jiān)聽狀態(tài)的流套接字s將維
        護(hù)一個客戶連接請求隊列,該隊列最多容納users個客戶連接請求。假如該函數(shù)執(zhí)行成功,
        則返回0;如果執(zhí)行失敗,則返回SOCKET_ERROR。
      
    */

        
      SOCKADDR_IN   addrClient;   
      
    int length = sizeof(SOCKADDR);   
        
      
    while(1)   
      
    {   
      sockConnect 
    = accept(sockSvc, (SOCKADDR*)&addrClient,&length); 
      
    /*
       SOCKET accept( 
          SOCKET s, 
          struct sockaddr FAR *addr, 
          int FAR *addrlen 
       ); 
       服務(wù)程序調(diào)用accept函數(shù)從處于監(jiān)聽狀態(tài)的流套接字s的客戶連接請求隊列中取出排在最前的一個客戶請求,
       并且創(chuàng)建一個新的套接字來與客戶套接字創(chuàng)建連接通道,如果連接成功,就返回新創(chuàng)建的套接字的描述符,
       以后與客戶套接字交換數(shù)據(jù)的是新創(chuàng)建的套接字;如果失敗就返回 INVALID_SOCKET。該函數(shù)的第一個參數(shù)
       指定處于監(jiān)聽狀態(tài)的流套接字;操作系統(tǒng)利用第二個參數(shù)來返回新創(chuàng)建的套接字的地址結(jié)構(gòu);操作系統(tǒng)利用
       第三個參數(shù)來返回新創(chuàng)建的套接字的地址結(jié)構(gòu)的長度。
      
    */

      
    if(INVALID_SOCKET != sockConnect)   
      
    {   
          HANDLE   hThread;   
          hThread
    =CreateThread(NULL,0,RecvData,(LPVOID)sockConnect,0,NULL); 
          
    /*
          /*
          我們得定義一個句柄用來存放它的返回值。還定義一個指向線程ID的DWORD值dwThreadId。
            CreateThread函數(shù)有六個參數(shù)分別是
             LPSECURITY_ATTRIBUTES lpThreadAttributes,  // pointer to security attributes
             DWORD dwStackSize,                         // initial thread stack size
             LPTHREAD_START_ROUTINE lpStartAddress,     // pointer to thread function
             LPVOID lpParameter,                        //argument for new thread
             DWORD dwCreationFlags,                     // creation flags
             LPDWORD lpThreadId                         // pointer to receive thread ID
          中第一個參數(shù)我們設(shè)置為NULL,使這個句柄不能被繼承;第二個參數(shù)設(shè)置為0,使用默認(rèn)的堆棧
          大小;第三個參數(shù)為線程函數(shù)的起始地址,也就是線程函數(shù)的函數(shù)名;第四個參數(shù)要傳遞給線程
          函數(shù)的值;第五個參數(shù)為0,創(chuàng)建好之后馬上讓線程運行;第六個參數(shù)設(shè)置為指向線程ID的地址。
          嚴(yán)格來說這里需要加錯誤檢測if(NULL == hThead){}
          
    */

          CloseHandle(hThread);   
      }
       
      }
       
        
      Sleep(INFINITE);   
      closesocket(sockConnect);   
      WSACleanup();  
    // 嚴(yán)格來說這里需要加錯誤檢測if(0 != WSACleanup()){}
      }
       
        
      DWORD   WINAPI   RecvData(LPVOID   lpParameter)  
    //線程接收函數(shù)  
      {   
      SOCKET   socket   
    =   (unsigned  int)lpParameter;   
      
    char   recvBuffer[1024];   
      
    for(;;)   
      
    {   
      
    //receive   data   from   client   
      if(SOCKET_ERROR == recv(socket, recvBuffer, 10240)) //和客戶端的send相對應(yīng)  
      {   
         cout
    <<"The   receive   data   defeat   or   was   the   client   side   already   withdraws\n"<<endl;   
         
    break;   
      }
       
      cout
    <<"Client says: "<<recvBuffer<<endl;   
      }
       
      closesocket(socket);   
    // 嚴(yán)格來說這里需要加錯誤檢測if(0 != closesocket(socket)){}
      return  0;   
    }
       

    /*
    * 客戶端
    */


    #include
    <Winsock2.h>   
    #include
    <stdio.h>   
    #pragma comment(lib,
    "Ws2_32.lib")

    void main()   
    {   
      WORD   wVersionRequested;   
      WSADATA   wsaData;   
      
    int   err;   
        
      wVersionRequested 
    = MAKEWORD(22);   
        
      err 
    = WSAStartup(wVersionRequested, &wsaData);   
      
    if(err != 0){   
         
    return;   
      }
       
        
        
      
    if(LOBYTE(wsaData.wVersion) != 2 ||
         HIBYTE(wsaData.wVersion) 
    != 2 ){   
         
          WSACleanup();   
          
    return;     
      }
       

      SOCKET sockClient 
    = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
      SOCKADDR_IN   addrClient;   
    //服務(wù)器地址信息
      addrClient.sin_addr.S_un.S_addr = inet_addr("192.168.94.37");   //要連接的服務(wù)地址
      addrClient.sin_family = AF_INET; //協(xié)議族  
      addrClient.sin_port = htons(4000);  //請求的端口 
        
      
    char  sendBuffer[1024];   //每次發(fā)送的最大數(shù)據(jù)量
      connect(sockClient, (SOCKADDR*)&addrClient, sizeof(SOCKADDR));//連接服務(wù)器端   
      while(true)   
      
    {   
        
    /*send   data   to   service*/   
        printf(
    "Please   input   data:\n");   
        
    if(gets(sendBuffer) == NULL)  //輸入要發(fā)送的數(shù)據(jù) 
        break;   
        
    else   
        
    {   
          
    if(SOCKET_ERROR == send(sockClient,sendBuffer,
              strlen(sendBuffer)
    +1,0)) //TCP方式發(fā)送  
          {   
             printf(
    "Transmission data defeat!\n");   
             
    break;   
          }
       
        }
       
      }
       
      closesocket(sockClient);    
    // 嚴(yán)格來說這里需要加錯誤檢測if(0 != closesocket(socket)){}
      WSACleanup();   
    }


    地震讓大伙知道:居安思危,才是生存之道。
    posted on 2007-11-27 23:44 小尋 閱讀(7225) 評論(3)  編輯  收藏 所屬分類: c/c++/C#/pasic/vb/php/asp(.net)/win-cgi/xml...

    FeedBack:
    # re: windows網(wǎng)絡(luò)編程【003】實現(xiàn)簡單WSASocket的C/S結(jié)構(gòu)-_-!~~~~~~ [未登錄] 2008-07-31 14:56 小白
    客戶端能指定自己的連接端口嗎?怎么指定?  回復(fù)  更多評論
      
    # re: windows網(wǎng)絡(luò)編程【003】實現(xiàn)簡單WSASocket的C/S結(jié)構(gòu)-_-!~~~~~~ [未登錄] 2008-07-31 17:04 小白
    我找到了指定客戶端端口號的方法,是使用bind函數(shù)。但我又碰到另一個問題:綁定了一個端口號后,怎么釋放這個端口號,以供下一次再使用這個端口號。  回復(fù)  更多評論
      
    # re: windows網(wǎng)絡(luò)編程【003】實現(xiàn)簡單WSASocket的C/S結(jié)構(gòu)-_-!~~~~~~ [未登錄] 2014-07-17 15:22 fedora
    博主在細(xì)節(jié)上講得很清楚,編程很規(guī)范,受教了!  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲国产综合专区在线电影| 亚洲成a人片在线观看播放| 久久久久久国产精品免费免费男同| 亚洲无删减国产精品一区| 免费看的黄色大片| 你懂的免费在线观看网站| 国产亚洲蜜芽精品久久| 亚洲精品不卡视频| 国产成人精品日本亚洲专区| 无码专区永久免费AV网站| 精品视频在线免费观看| 成人亚洲国产精品久久| 亚洲国产综合在线| 亚洲乱码一区二区三区在线观看| 曰批全过程免费视频在线观看| 香蕉视频免费在线| 亚洲精品成人久久| 亚洲精品无码不卡在线播HE| 无码国模国产在线观看免费| 亚色九九九全国免费视频| 日本亚洲欧洲免费天堂午夜看片女人员| 精品亚洲成在人线AV无码| 亚洲av无码潮喷在线观看| 国产成人毛片亚洲精品| 国产精品四虎在线观看免费| jjizz全部免费看片| 国产麻豆成人传媒免费观看 | 亚洲人成人网毛片在线播放| 亚洲国产美女精品久久久久∴| 免费一级特黄特色大片在线| 毛片在线看免费版| 国产曰批免费视频播放免费s| 青青操免费在线视频| a级毛片免费观看在线| 国产成人综合亚洲一区| 亚洲乱人伦中文字幕无码| 亚洲日韩精品无码专区| 久久青青草原亚洲AV无码麻豆| 亚洲第一区精品日韩在线播放| 免费观看的a级毛片的网站| 夫妻免费无码V看片|