• <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  評(píng)論-8  文章-0  trackbacks-0

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


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

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

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

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

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

            SOCKADDR_IN addrSrv;
            addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉(zhuǎn)換Unsigned short為網(wǎng)絡(luò)字節(jié)序的格式
            addrSrv.sin_family=AF_INET;
            addrSrv.sin_port=htons(6000);

            bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
            //將套接字綁定到一個(gè)本地地址和端口上(bind)
            listen(sockSrv,5);//將套接字設(shè)為監(jiān)聽(tīng)模式,準(zhǔn)備接收客戶(hù)請(qǐng)求(listen)。

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

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

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

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

            wVersionRequested = MAKEWORD( 1, 1 );

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

            if ( LOBYTE( wsaData.wVersion ) != 1 ||
                    HIBYTE( wsaData.wVersion ) != 1 ) {
            WSACleanup( );
            return; 
            }
            SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);創(chuàng)建套接字(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));向服務(wù)器發(fā)出連接請(qǐng)求(connect)。

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

            closesocket(sockClient);關(guān)閉套接字。
            WSACleanup();//必須調(diào)用這個(gè)函數(shù)清除參數(shù)
            }

            2.UDP型套接字。
            服務(wù)器端(接收端)程序:
            1、創(chuàng)建套接字(socket)。 
            2、將套接字綁定到一個(gè)本地地址和端口上(bind)。
            3、等待接收數(shù)據(jù)(recvfrom)。
            4、關(guān)閉套接字。
            客戶(hù)端(發(fā)送端)程序:
            1、創(chuàng)建套接字(socket)。 
            2、向服務(wù)器發(fā)送數(shù)據(jù)(sendto)。
            3、關(guān)閉套接字。
            服務(wù)器端代碼:
            #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();
            }

            客戶(hù)端代碼:
            #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();
            }
            ===========下面是字符界面下的一個(gè)簡(jiǎn)單UDP聊天程序=====
            服務(wù)器端:==============================
            #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();

            }

            客戶(hù)端:===============================
            #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 老馬驛站 閱讀(3095) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): c++
            国内精品伊人久久久影院| 久久天天躁狠狠躁夜夜网站| 国产高清国内精品福利99久久| 久久777国产线看观看精品| 国产精品成人久久久久久久| 久久亚洲欧洲国产综合| 亚洲午夜福利精品久久| 久久久久夜夜夜精品国产| 欧美一级久久久久久久大| 国产亚洲精品美女久久久| 欧美日韩精品久久久免费观看| 久久亚洲中文字幕精品有坂深雪| 久久国产免费直播| 久久久精品人妻一区二区三区四 | …久久精品99久久香蕉国产| 国产毛片久久久久久国产毛片| 无码日韩人妻精品久久蜜桃| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久九九有精品国产23百花影院| 日本五月天婷久久网站| 99久久www免费人成精品| 欧美大香线蕉线伊人久久| 亚洲人AV永久一区二区三区久久| 狠狠色伊人久久精品综合网 | 蜜桃麻豆www久久| 久久精品无码专区免费东京热| 99久久综合国产精品免费| 青青久久精品国产免费看| 国产亚洲成人久久| 久久精品国产一区二区| 久久99精品久久久久久野外| 国产精品美女久久久网AV| 国产免费福利体检区久久| 香蕉久久一区二区不卡无毒影院 | 91精品国产综合久久精品| 人妻久久久一区二区三区| 亚洲AV成人无码久久精品老人| 久久国产免费直播| 伊人久久大香线蕉综合Av| 狠狠色综合网站久久久久久久高清 | 久久久久亚洲AV综合波多野结衣|