• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-167  評論-8  文章-0  trackbacks-0

            socket編程(udp tcp)代碼備忘 C++/C


            sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM),原始套接字(SOCK_RAW); 基于TCP的socket編程是采用的流式套接字(SOCK_STREAM)?;赨DP采用的數據報套接字(SOCK_DGRAM).
            1.TCP流式套接字的編程步驟
            在使用之前須鏈接庫函數:工程->設置->Link->輸入ws2_32.lib,OK!
            服務器端程序:
            1、加載套接字庫
            2、創建套接字(socket)。 
            3、將套接字綁定到一個本地地址和端口上(bind)。
            4、將套接字設為監聽模式,準備接收客戶請求(listen)。
            5、等待客戶請求到來;當請求到來后,接受連接請求,返回一個新的對應于此次連接的套接字(accept)。
            6、用返回的套接字和客戶端進行通信(send/recv)。
            7、返回,等待另一客戶請求。
            8、關閉套接字。
            客戶端程序:
            1、加載套接字庫
            2、創建套接字(socket)。 
            3、向服務器發出連接請求(connect)。
            4、和服務器端進行通信(send/recv)。
            5、關閉套接字。
            服務器端代碼如下:
            #include <Winsock2.h>//加裁頭文件
            #include <stdio.h>//加載標準輸入輸出頭文件

            void main()
            {
            WORD wVersionRequested;//版本號
            WSADATA wsaData;
            int err;

            wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字

            err = WSAStartup( wVersionRequested, &wsaData );
            if ( err != 0 ) {
            return;
            }//加載套接字庫,加裁失敗則返回

            if ( LOBYTE( wsaData.wVersion ) != 1 ||
                    HIBYTE( wsaData.wVersion ) != 1 ) {
            WSACleanup( );
            return; 
            }//如果不是1.1的則退出
            SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建套接字(socket)。

            SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉換Unsigned short為網絡字節序的格式
            addrSrv.sin_family=AF_INET;
            addrSrv.sin_port=htons(6000);

            bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
            //將套接字綁定到一個本地地址和端口上(bind)
            listen(sockSrv,5);//將套接字設為監聽模式,準備接收客戶請求(listen)。

            SOCKADDR_IN addrClient;//定義地址族
            int len=sizeof(SOCKADDR);//初始化這個參數,這個參數必須被初始化

            while(1)
            {
            SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);accept的第三個參數一定要有初始值。
            //等待客戶請求到來;當請求到來后,接受連接請求,返回一個新的對應于此次連接的套接字(accept)。
            //此時程序在此發生阻塞
            char sendBuf[100];
            sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
                inet_ntoa(addrClient.sin_addr));
            //用返回的套接字和客戶端進行通信(send/recv)。
            send(sockConn,sendBuf,strlen(sendBuf)+1,0);
            char recvBuf[100];
            recv(sockConn,recvBuf,100,0);
            printf("%s\n",recvBuf);
            closesocket(sockConn);//關閉套接字。等待另一個用戶請求
            }
            }

            客戶端代碼如下:
            #include <Winsock2.h>
            #include <stdio.h>

            void main()
            {
            WORD wVersionRequested;
            WSADATA wsaData;
            int err;

            wVersionRequested = MAKEWORD( 1, 1 );

            err = WSAStartup( wVersionRequested, &wsaData );加載套接字庫
            if ( err != 0 ) {
            return;
            }

            if ( LOBYTE( wsaData.wVersion ) != 1 ||
                    HIBYTE( wsaData.wVersion ) != 1 ) {
            WSACleanup( );
            return; 
            }
            SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);創建套接字(socket)。

            SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
            addrSrv.sin_family=AF_INET;
            addrSrv.sin_port=htons(6000);
            connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服務器發出連接請求(connect)。

            char recvBuf[100];和服務器端進行通信(send/recv)。
            recv(sockClient,recvBuf,100,0);
            printf("%s\n",recvBuf);
            send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

            closesocket(sockClient);關閉套接字。
            WSACleanup();//必須調用這個函數清除參數
            }

            2.UDP型套接字。
            服務器端(接收端)程序:
            1、創建套接字(socket)。 
            2、將套接字綁定到一個本地地址和端口上(bind)。
            3、等待接收數據(recvfrom)。
            4、關閉套接字。
            客戶端(發送端)程序:
            1、創建套接字(socket)。 
            2、向服務器發送數據(sendto)。
            3、關閉套接字。
            服務器端代碼:
            #include <Winsock2.h>
            #include <stdio.h>

            void main()
            {
            WORD wVersionRequested;
            WSADATA wsaData;
            int err;

            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_DGRAM,0);
            SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
            addrSrv.sin_family=AF_INET;
            addrSrv.sin_port=htons(6000);

            bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

            SOCKADDR_IN addrClient;
            int len=sizeof(SOCKADDR);
            char recvBuf[100];

            recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
            printf("%s\n",recvBuf);
            closesocket(sockSrv);
            WSACleanup();
            }

            客戶端代碼:
            #include <Winsock2.h>
            #include <stdio.h>

            void main()
            {
            WORD wVersionRequested;
            WSADATA wsaData;
            int err;

            wVersionRequested = MAKEWORD( 1, 1 );

            err = WSAStartup( wVersionRequested, &wsaData );
            if ( err != 0 ) {
            return;
            }

            if ( LOBYTE( wsaData.wVersion ) != 1 ||
                    HIBYTE( wsaData.wVersion ) != 1 ) {
            WSACleanup( );
            return; 
            }

            SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
            SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
            addrSrv.sin_family=AF_INET;
            addrSrv.sin_port=htons(6000);

            sendto(sockClient,"Hello",strlen("Hello")+1,0,
            (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
            closesocket(sockClient);
            WSACleanup();
            }
            ===========下面是字符界面下的一個簡單UDP聊天程序=====
            服務器端:==============================
            #include <stdio.h>
            #include <WINSOCK2.H>

            void main()
            {
            WORD wVersionRequested;
            WSADATA wsaData;
            int err;

            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_DGRAM,0);

            SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
            addrSrv.sin_family=AF_INET;
            addrSrv.sin_port=htons(6101);

            bind(sockSrv,(sockaddr*)&addrSrv,sizeof(sockaddr));

            char sendBuf[100];
            char recvBuf[100];
            char tempBuf[100];
            int len=sizeof(sockaddr);
                SOCKADDR_IN addrClient;
            while(1)
            {

            recvfrom(sockSrv,tempBuf,strlen(tempBuf),0,(sockaddr*)&addrClient,&len);
            if('q'!=tempBuf[0])
            {
                sprintf(recvBuf,"%s say: %s",inet_ntoa(addrClient.sin_addr),tempBuf);
                  printf("%s\n",recvBuf);
                  printf("please input your data: ");
                  gets(sendBuf);
                  sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(sockaddr*)&addrClient,len);
            }
            else
            {
                printf("%s request to quit the chat platform.\n",
                inet_ntoa(addrClient.sin_addr));
                sendto(sockSrv,"q",strlen("q")+1,0,(sockaddr*)&addrClient,len);
                break;
            }
            }
            closesocket(sockSrv);
                WSACleanup();

            }

            客戶端:===============================
            #include <stdio.h>
            #include <WINSOCK2.H>

            void main()
            {
            WORD wVersionRequested;
            WSADATA wsaData;
            int err;

            wVersionRequested = MAKEWORD( 1, 1 );

            err = WSAStartup( wVersionRequested, &wsaData );
            if ( err != 0 )
            {
            return;
            }
            if ( LOBYTE( wsaData.wVersion ) != 1 ||
                    HIBYTE( wsaData.wVersion ) != 1 )
            {
            WSACleanup( );
            return; 
            }
            SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

            SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
            //htonl htons inet_addr inet_ntoa
            addrSrv.sin_family=AF_INET;
            addrSrv.sin_port=htons(6101);

            char sendBuf[100];
            char tempBuf[100];
            char recvBuf[100];
            int len=sizeof(sockaddr);

            while(1)
            {
            printf("please input your data: ");
            gets(sendBuf);
            sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(sockaddr*)&addrSrv,len);
            recvfrom(sockClient,tempBuf,strlen(tempBuf),0,(sockaddr*)&addrSrv,&len);
            if('q'!=tempBuf[0])
            {
                sprintf(recvBuf,"%s say: %s",inet_ntoa(addrSrv.sin_addr),tempBuf);
                printf("%s\n",recvBuf);
            }
            else
            {
                printf("the server has been closed!\n");
                sendto(sockClient,"q",strlen("q")+1,0,(sockaddr*)&addrSrv,len);
                break;
            }

            }

            closesocket(sockClient);
            WSACleanup();

            posted on 2011-04-06 10:44 老馬驛站 閱讀(3086) 評論(0)  編輯 收藏 引用 所屬分類: c++
            狠狠久久综合| 久久精品成人一区二区三区| 亚洲国产天堂久久综合网站| 影音先锋女人AV鲁色资源网久久| 91精品婷婷国产综合久久| 狠狠狠色丁香婷婷综合久久五月 | 婷婷久久久亚洲欧洲日产国码AV | 久久国产成人午夜aⅴ影院 | 国产伊人久久| 国产99久久久国产精品~~牛| 色婷婷综合久久久久中文| 亚洲中文字幕无码久久2020| 亚洲愉拍99热成人精品热久久| 国内精品久久久久影院老司| 久久精品国产亚洲AV香蕉| 久久99精品久久久大学生| 色偷偷偷久久伊人大杳蕉| 久久久久久九九99精品| 国产精品久久一区二区三区| 国产精品久久久久影院嫩草| 91精品国产高清久久久久久91 | 久久综合九色欧美综合狠狠| 欧美久久综合九色综合| 久久久久久午夜精品| 欧美午夜精品久久久久免费视| jizzjizz国产精品久久| 久久精品国产99国产精品澳门| 国产成人精品久久综合| 中文字幕一区二区三区久久网站| 久久精品成人影院| 久久香综合精品久久伊人| 久久丫精品国产亚洲av不卡| 四虎国产精品免费久久5151| 久久久久国色AV免费看图片| 伊人久久大香线蕉av不卡| 99久久中文字幕| 伊人伊成久久人综合网777| 久久精品毛片免费观看| 精品免费久久久久国产一区| 伊人久久大香线蕉av不变影院| 久久91精品国产91久久户|