• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            VC++UDP實(shí)現(xiàn)可靠傳輸(文件)(虛擬TCP)(點(diǎn)擊:1343)

            /*
            發(fā)布時(shí)間: 2008-12-27
            程序版本: vtcp.dll ver1.0.0(beta0)
            模塊下載BIN: http://www.cnasm.com/down/vtcp.dll
            測(cè)試程序BIN: http://www.cnasm.com/down/vtcptest.exe
            測(cè)試程序SRC: http://www.cnasm.com/down/vtcptest.rar

            吹一下: 別看vtcp程序小(17KB)但幾乎模擬了TCP的一切,滑動(dòng)窗口...目前他提供阻塞模式與異步完成模式API支持.

            目前局網(wǎng)效率:
            以UDP可靠傳輸文件為例,10OMbps局網(wǎng)傳輸極限速度(6MB/S),網(wǎng)絡(luò)占有率50%
            高于TCP協(xié)議(5MB/S),網(wǎng)絡(luò)占有率50%,如何進(jìn)一步提高UDP傳輸效率,還需要研究實(shí)驗(yàn),我想我應(yīng)該接近極限了,
            目前要做的就是提高vtcp的穩(wěn)定性與兼容winsock編程接口.

            目前外網(wǎng)效率:
            以UDP可靠傳輸文件為例,外網(wǎng)與TCP協(xié)議相當(dāng),TCP(50KB/S)時(shí),測(cè)試VTCP(30-110KB/S).

            vtcptest -s port : 打開(kāi)服務(wù)端口
            vtcptest -c host port path 下載文件

            例如:
            開(kāi)服務(wù)執(zhí)行: vtcptest -s 8080
            下文件執(zhí)行: vtcptest -c 192.168.0.102 8080 c:\1234.rmvb

            connect...
            connect ok!
            save to: c:\1234.rmvb.download
            recv: 214245376 bytes, rapid: 6152 kb/s
            download ok ( 214592451 bytes )!!!

            quit...
            */

            //API接口

            #pragma once

            int WINAPI vtcp_startup();
            int WINAPI vtcp_cleanup();
            int WINAPI vtcp_socket(int type);//0=tcp client socket,1=tcp service socket
            int WINAPI vtcp_bind(int s,PSOCKADDR_IN sai,int sailen);
            int WINAPI vtcp_listen(int s,int backlog);
            int WINAPI vtcp_accept(int s);
            int WINAPI vtcp_connect(int s,PSOCKADDR_IN sai,int sailen,int timeo);
            int WINAPI vtcp_sendex(int s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,
            DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
            int WINAPI vtcp_recvex(int s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,
            LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
            int WINAPI vtcp_send(int s,PCHAR buf,int len);
            int WINAPI vtcp_recv(int s,PCHAR buf,int len);
            int WINAPI vtcp_closesocket(int s);
            int WINAPI vtcp_getlasterror(int s);

            //////////////////////////////////////////////////////////////////////////
            //int WINAPI vtcp_setkeepalive(int keepalive,int keepaliveinternal);
            //int WINAPI vtcp_setsendtimeo(int timeo);
            //int WINAPI vtcp_setrecvtimeo(int timeo);
            //////////////////////////////////////////////////////////////////////////


            //////////////////////////////////////////////////////////////////////////
            //測(cè)試程序VC++ console 代碼
            //////////////////////////////////////////////////////////////////////////

             

            // vtcptest.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。

            //

            #include

            "stdafx.h"

             

            ULONG WINAPI TA(LPVOID p)

            {

            int s=int(p);

            char buffer[8192];

            while(true)

            {

            int rcb=vtcp_recv(s,buffer,sizeof(buffer));

            if(rcb<0)

            {

            vtcp_closesocket(s);

            return0;

            }

            HANDLE hfile=CreateFile(buffer,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);

            if(INVALID_HANDLE_VALUE==hfile)

            {

            vtcp_closesocket(s);

            return0;

            }

            DWORD cb=(-1);

            while(true)

            {

            if(!ReadFile(hfile,buffer,8192,&cb,NULL))

            {

            break;

            }

            if(cb==0)

            {

            break;

            }

            if(0>=vtcp_send(s,buffer,cb))

            {

            break;

            }

            }

            CloseHandle(hfile);

            if(cb==0)

            {

            if(0>=vtcp_send(s,"X",1))

            {

            vtcp_closesocket(s);

            return0;

            }

            }

            else

            {

            vtcp_closesocket(s);

            return0;

            }

            }

            return0;

            }

            ULONG WINAPI TS(DWORD port)

            {

            SOCKADDR_IN sai;

            sai.sin_family=AF_INET;

            sai.sin_addr.S_un.S_addr=0;

            sai.sin_port=htons(WORD(port));

            int s=vtcp_socket(1);

            if(0==s)

            {

            return SOCKET_ERROR;

            }

            if(0!=vtcp_bind(s,&sai,sizeof(sai)))

            {

            return SOCKET_ERROR;

            }

            if(0!=vtcp_listen(s,5))

            {

            return SOCKET_ERROR;

            }

            printf("listen success...\r\n");

            while(true)

            {

            int as=vtcp_accept(s);

            if(0!=as)

            {

            DWORD dwtid;

            CloseHandle(CreateThread(NULL,0,TA,LPVOID(as),0,&dwtid));

            printf("accept success...\r\n");

            }

            }

            vtcp_closesocket(s);

            return0;

            }

            ULONG WINAPI TC(PCHAR host,DWORD port,PCHAR path)

            {

            PHOSTENT ph=gethostbyname(host);

            if(NULL==ph)

            {

            return0;

            }

            SOCKADDR_IN sai;

            sai.sin_family=AF_INET;

            sai.sin_addr.S_un.S_addr=*LPDWORD(ph->h_addr_list[0]);

            sai.sin_port=htons(WORD(port));

            int s=vtcp_socket(0);

            printf("connect...\r\n");

            if(vtcp_connect(s,&sai,sizeof(sai),1000*30))

            {

            vtcp_closesocket(s);

            return0;

            }

            printf("connect ok!\r\n");

            if(0>=vtcp_send(s,path,1024))

            {

            vtcp_closesocket(s);

            return0;

            }

            char buffer[8192];

            lstrcpy(buffer,path);

            lstrcat(buffer,".download");

            printf("save to: %s\r\n",buffer);

            HANDLE hfile=CreateFile(buffer,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);

            if(INVALID_HANDLE_VALUE==hfile)

            {

            vtcp_closesocket(s);

            return0;

            }

            DWORD wcb,count=0;

            DWORD dw=GetTickCount();

            DWORD dwsize=0,dwrapid;

            while(true)

            {

            int rcb=vtcp_recv(s,buffer,sizeof(buffer));

            if(rcb==1)

            {

            if(buffer[0]==$1$X$1$)

            {

            break;

            }

            }

            if(!WriteFile(hfile,buffer,rcb,&wcb,NULL))

            {

            break;

            }

            count=count+rcb;

            DWORD dw2=GetTickCount();

            dwsize=dwsize+rcb;

            if(dw2-dw>1000)

            {

            dwrapid=dwsize/(dw2-dw);

            dwsize=0;

            dw=dw2;

            printf("recv: %d bytes, rapid: %d kb/s \r",count,dwrapid);

            }

            }

            CloseHandle(hfile);

            vtcp_closesocket(s);

            printf("\r\n");

            printf("download ok ( %d bytes )!!!\r\n",count);

            printf("\r\n");

            return0;

            }

            int

            main(int argc,char* argv[])

            {

            vtcp_startup();

            if(argc==3)

            if(!lstrcmpi(argv[1],"-s"))

            {

            TS(atoi(argv[2]));

            }

            if(argc==5)

            if(!lstrcmpi(argv[1],"-c"))

            {

            TC(argv[2],atoi(argv[3]),argv[4]);

            }

            vtcp_cleanup();

            printf("quit...\r\n");

            return0;

            }

            Feedback

            # re: [轉(zhuǎn)]VC++UDP實(shí)現(xiàn)可靠傳輸(文件)(虛擬TCP)([未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-04-28 20:25 by a
            滑動(dòng)窗口應(yīng)該可以達(dá)到95%。你這才50%,還差的遠(yuǎn)呢
            久久精品九九亚洲精品| 午夜精品久久影院蜜桃| 热RE99久久精品国产66热| 精品国际久久久久999波多野| 要久久爱在线免费观看| 国产精品va久久久久久久| 久久精品国产亚洲欧美| 久久人妻无码中文字幕| 午夜精品久久久久久影视riav| 久久强奷乱码老熟女| 久久久久久亚洲精品不卡 | 久久99久久成人免费播放| 久久99中文字幕久久| 久久综合久久久| 国产午夜精品久久久久九九| 99久久99久久精品国产| 久久国产美女免费观看精品| 久久午夜福利电影| 7777久久久国产精品消防器材| 人妻无码精品久久亚瑟影视| 99久久精品免费看国产一区二区三区| 国产成人无码精品久久久性色| 777午夜精品久久av蜜臀| 久久国产精品无码一区二区三区| 国产精品免费福利久久| 国产成人精品综合久久久| 久久影视综合亚洲| 老色鬼久久亚洲AV综合| 91精品日韩人妻无码久久不卡| 国产成人综合久久精品尤物| 日本久久久久久久久久| 久久亚洲AV成人无码国产| 青青青国产精品国产精品久久久久| 久久亚洲国产精品123区| 日韩乱码人妻无码中文字幕久久| 久久免费视频观看| 久久综合偷偷噜噜噜色| 色噜噜狠狠先锋影音久久| 久久久久波多野结衣高潮| 久久精品国产99国产精品澳门| 久久亚洲精品国产亚洲老地址|