• <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++
            香蕉久久夜色精品国产尤物| 国产精品久久久久影视不卡| 久久久久久av无码免费看大片 | 久久99精品久久久大学生| 亚洲欧美久久久久9999| 久久国产色AV免费看| 久久精品国产亚洲一区二区三区 | 久久婷婷人人澡人人| 亚洲中文久久精品无码ww16 | 久久婷婷人人澡人人| 亚洲国产精品无码久久SM| 亚洲一本综合久久| 香蕉99久久国产综合精品宅男自 | 久久国产综合精品五月天| 久久无码中文字幕东京热| 久久久国产精品福利免费| 人妻系列无码专区久久五月天| 久久久精品人妻一区二区三区蜜桃 | 99久久精品国产毛片| 亚洲va久久久噜噜噜久久男同| 久久久久亚洲av成人无码电影 | 久久无码国产专区精品| 国产三级精品久久| 久久精品成人国产午夜| 亚洲AV无码一区东京热久久 | 一本色道久久88精品综合| 久久久久亚洲精品中文字幕| 国产精品久久久久无码av| 久久精品蜜芽亚洲国产AV| 亚洲午夜无码久久久久| 久久中文字幕精品| 中文字幕无码久久精品青草| 久久精品综合一区二区三区| 亚洲欧美精品伊人久久| 久久免费小视频| 国产精品女同一区二区久久| 国产一区二区三区久久精品| 嫩草伊人久久精品少妇AV| 亚洲乱码中文字幕久久孕妇黑人| 99久久国产宗和精品1上映| 99精品久久久久久久婷婷|