• <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++
            色88久久久久高潮综合影院| 久久精品九九亚洲精品| 伊人色综合久久天天人守人婷| 亚洲色欲久久久久综合网| 久久亚洲中文字幕精品有坂深雪| 国产精品久久久久影院嫩草| 亚洲国产成人久久一区WWW| 久久久久久精品免费免费自慰| 久久国产精品久久| 久久人人添人人爽添人人片牛牛| 欧美精品一本久久男人的天堂| 漂亮人妻被中出中文字幕久久| 久久免费小视频| 久久亚洲精品成人AV| 日本加勒比久久精品| 久久婷婷久久一区二区三区| 中文字幕无码久久久| 99热精品久久只有精品| 久久婷婷激情综合色综合俺也去| 久久久久久亚洲精品无码| 久久国产亚洲精品无码| 麻豆国内精品久久久久久| .精品久久久麻豆国产精品| 久久中文字幕人妻熟av女| 99久久无码一区人妻| 久久国产乱子伦精品免费强| 日本久久久久亚洲中字幕| 亚洲精品成人久久久| 久久久久久国产a免费观看不卡| 国产韩国精品一区二区三区久久| 伊人久久大香线蕉综合Av| 国内精品久久久久久久久电影网| 三级片免费观看久久| 四虎久久影院| 久久国产色av免费看| 伊人久久大香线蕉av不变影院 | 久久婷婷五月综合97色一本一本 | 好久久免费视频高清| 久久精品国产亚洲精品2020| 欧美午夜精品久久久久免费视| 少妇久久久久久久久久|