新聞中心
隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)通信技術(shù)也愈加成熟,TCP/IP 協(xié)議成為網(wǎng)絡(luò)通信的標(biāo)準(zhǔn)。而 VC TCP 數(shù)據(jù)庫(kù)是一種基于 TCP/IP 協(xié)議的數(shù)據(jù)庫(kù)通信技術(shù),其具有高效、快速、穩(wěn)定等特點(diǎn),在大型網(wǎng)站和系統(tǒng)中應(yīng)用非常廣泛。本文將介紹 ,幫助開發(fā)者更加方便地使用 VC TCP 數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)通信。

成都創(chuàng)新互聯(lián)是一家專業(yè)提供瀘溪企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為瀘溪眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
一、基本概念
VC TCP 數(shù)據(jù)庫(kù)是一種基于 TCP/IP 協(xié)議的數(shù)據(jù)庫(kù)通信技術(shù)。其通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù),實(shí)現(xiàn)客戶端與服務(wù)器之間的數(shù)據(jù)交流。VC TCP 數(shù)據(jù)庫(kù)使用數(shù)據(jù)庫(kù)通信類庫(kù),實(shí)現(xiàn)了通信、連接、數(shù)據(jù)發(fā)送等各種功能。在 VC TCP 數(shù)據(jù)庫(kù)中,數(shù)據(jù)的發(fā)送是通過(guò)套接字(socket)實(shí)現(xiàn)的,而套接字又是通過(guò) TCP/IP 協(xié)議實(shí)現(xiàn)的。
二、VC TCP 數(shù)據(jù)庫(kù)的發(fā)送流程
VC TCP 數(shù)據(jù)庫(kù)的發(fā)送流程如下:
1. 初始化套接字
需要通過(guò)啟動(dòng) WSAStartup 函數(shù)初始化 Winsock 庫(kù),并使用 socket 函數(shù)創(chuàng)建套接字。
2. 建立連接
客戶端通過(guò) connect 函數(shù)連接服務(wù)器。在連接建立之前,需要確認(rèn)服務(wù)器的 IP 地址和端口號(hào),并通過(guò) sockaddr_in 結(jié)構(gòu)體指定服務(wù)器地址。connect 函數(shù)將向服務(wù)器發(fā)送連接請(qǐng)求,并等待服務(wù)器返回應(yīng)答。
3. 發(fā)送數(shù)據(jù)
連接建立后,客戶端可以使用 send 函數(shù)向服務(wù)器發(fā)送數(shù)據(jù)。send 函數(shù)需要指定發(fā)送的數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)緩沖區(qū)。發(fā)送數(shù)據(jù)時(shí),還可以通過(guò)設(shè)置 send 的標(biāo)識(shí)參數(shù)來(lái)控制數(shù)據(jù)的發(fā)送方式。
4. 關(guān)閉連接
當(dāng)客戶端發(fā)送完數(shù)據(jù)后,需要使用 closesocket 函數(shù)關(guān)閉套接字,釋放資源。
三、
1. 使用非阻塞模式發(fā)送數(shù)據(jù)
在 VC TCP 數(shù)據(jù)庫(kù)中,發(fā)送數(shù)據(jù)是通過(guò) send 函數(shù)實(shí)現(xiàn)的。如果在發(fā)送數(shù)據(jù)時(shí),套接字處于阻塞模式,那么程序?qū)?huì)一直等待數(shù)據(jù)發(fā)送完成。這會(huì)導(dǎo)致程序的響應(yīng)速度變慢。為了提高程序的響應(yīng)速度,可以使用非阻塞模式發(fā)送數(shù)據(jù)。使用非阻塞模式后,程序?qū)⒃诘却l(fā)送完成時(shí),立即退出 send 函數(shù),繼續(xù)執(zhí)行其它任務(wù),從而提高程序的響應(yīng)速度。
2. 設(shè)置緩沖區(qū)大小
在 VC TCP 數(shù)據(jù)庫(kù)中,使用 send 函數(shù)發(fā)送數(shù)據(jù)時(shí),需要提供數(shù)據(jù)緩沖區(qū)。如果數(shù)據(jù)緩沖區(qū)較小,而需要發(fā)送的數(shù)據(jù)量較大,會(huì)導(dǎo)致發(fā)送數(shù)據(jù)的效率降低。為了提高發(fā)送數(shù)據(jù)的效率,可以使用 setsockopt 函數(shù)設(shè)置緩沖區(qū)的大小。通過(guò)設(shè)置緩沖區(qū)大小為適當(dāng)?shù)闹?,能夠提高發(fā)送數(shù)據(jù)的效率,減少網(wǎng)絡(luò)傳輸?shù)臅r(shí)間。
3. 使用數(shù)據(jù)壓縮技術(shù)
在 VC TCP 數(shù)據(jù)庫(kù)中,使用數(shù)據(jù)壓縮技術(shù)能夠?qū)?shù)據(jù)的體積減小,從而減少網(wǎng)絡(luò)傳輸?shù)臅r(shí)間。常用的數(shù)據(jù)壓縮技術(shù)有 GZIP 和 ZIP,可以根據(jù)需要進(jìn)行選擇。在進(jìn)行數(shù)據(jù)壓縮時(shí),需要考慮數(shù)據(jù)壓縮的負(fù)載和壓縮解壓縮的速度。
四、
VC TCP 數(shù)據(jù)庫(kù)是一種基于 TCP/IP 協(xié)議的數(shù)據(jù)庫(kù)通信技術(shù),具有高效、快速、穩(wěn)定等特點(diǎn)。在使用 VC TCP 數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)時(shí),可以使用一些技巧來(lái)提高程序的性能和效率。本文介紹了 VC TCP 數(shù)據(jù)庫(kù)的發(fā)送流程和一些技巧,希望本文可以對(duì)開發(fā)者在開發(fā) VC TCP 數(shù)據(jù)庫(kù)應(yīng)用程序時(shí)提供幫助。
相關(guān)問(wèn)題拓展閱讀:
- VC的TCP/IP通信
- VC C++ send數(shù)據(jù)到網(wǎng)絡(luò)有堆包現(xiàn)象。請(qǐng)問(wèn)怎樣可以不堆包。
VC的TCP/IP通信
用socket就可以跨越網(wǎng)絡(luò)呀,但是里面有一個(gè)內(nèi)網(wǎng)的問(wèn)題。這不是三言兩語(yǔ)可以解決的
你們上網(wǎng)的方式是通過(guò)路由器上網(wǎng)的 你在網(wǎng)上查 的IP地址是 路由器的IP地址 并不是主機(jī)的IP 地址所以你的客戶端并不能連接到服務(wù)端。 要像 QQ那樣 你必須得有個(gè)外網(wǎng)IP 也就是 你的網(wǎng)線通過(guò)貓 直接連接好皮雀 機(jī)器 不通過(guò)路由上網(wǎng) 這時(shí)你的 IP 就是外網(wǎng)IP也就是你56.42.37.42 這個(gè)了。 這握巧時(shí)候友早能上網(wǎng)的其他用戶才能連接你服務(wù)端建立連接。
VC C++ send數(shù)據(jù)到網(wǎng)絡(luò)有堆包現(xiàn)象。請(qǐng)問(wèn)怎樣可以不堆包。
一個(gè)包沒有固定長(zhǎng)度,以太網(wǎng)限制在46-1500字節(jié),1500就是以太網(wǎng)的MTU,超過(guò)這個(gè)量,TCP會(huì)為IP數(shù)據(jù)報(bào)設(shè)置偏移量進(jìn)行分片傳輸,現(xiàn)在一般可允許應(yīng)用層設(shè)置8k(NTFS系統(tǒng))的緩沖區(qū),8k的數(shù)據(jù)由底層分片,而應(yīng)用層看來(lái)只是一次發(fā)送。
windows的緩沖區(qū)經(jīng)驗(yàn)值是4k。
Socket本身分為兩種,流(TCP)和數(shù)據(jù)報(bào)(UDP),你的問(wèn)題針對(duì)這兩種不同使用而結(jié)論不一樣。甚至還和你是用阻塞、還是非阻塞Socket來(lái)編程坦罩有關(guān)。
1、通信長(zhǎng)度,這個(gè)是你自己決定的,沒有系統(tǒng)強(qiáng)迫你要發(fā)多大的包,實(shí)際應(yīng)該根據(jù)需求和網(wǎng)絡(luò)狀況來(lái)決定。對(duì)于TCP,這個(gè)長(zhǎng)度可以大點(diǎn),但要知道,Socket內(nèi)部默認(rèn)的收發(fā)緩沖區(qū)大小大概是8K,你可以用SetSockOpt來(lái)改變。但對(duì)于UDP,就不要太大,一般在1024至10K。注意一點(diǎn),你無(wú)論發(fā)多大的包,IP層和鏈路層都會(huì)把你的包進(jìn)行分片發(fā)送,一般局域網(wǎng)就是1500左右,廣域網(wǎng)就只有幾十字節(jié)。分片后的包將經(jīng)過(guò)不同的路由到達(dá)接收方,對(duì)于UDP而言,要是其中一個(gè)分片丟失,那么接收方的IP層將把整個(gè)發(fā)送包丟棄,這就形成丟包。顯然,要是一個(gè)UDP發(fā)包佷大,它被分片后,鏈路層丟失分片的幾率就佷大,你這個(gè)UDP包,就佷容易丟失,但是太小又影響效率。更好可以配置這個(gè)值,以根據(jù)不同的環(huán)境來(lái)調(diào)整到更佳狀態(tài)。
send()函數(shù)返回了實(shí)際發(fā)送的長(zhǎng)度,在網(wǎng)絡(luò)不斷的情況下,它絕不會(huì)返回(發(fā)送失敗的)錯(cuò)誤物擾,最多就是返回0。對(duì)于TCP你可以寫一個(gè)循環(huán)發(fā)送。當(dāng)send函數(shù)返回SOCKET_ERROR時(shí),才標(biāo)志著有錯(cuò)誤。但對(duì)于UDP,你不要寫循環(huán)發(fā)送,否則將給你的接收帶來(lái)極大的麻煩。所以UDP需要用SetSockOpt來(lái)改變Socket內(nèi)部Buffer的大小,以能容納你的發(fā)包。明確一點(diǎn),TCP作為流,發(fā)包是不會(huì)整包到達(dá)的,而是源源不斷的到,那接收方就必須組包。而UDP作為消息或數(shù)據(jù)報(bào),它一定是整包到達(dá)接收方。
2、關(guān)于接收,一般的發(fā)包都有包邊界,首要的就是你這個(gè)包的長(zhǎng)度要讓接收方知道,于是就有個(gè)包頭信息,對(duì)于TCP,接收方先收這個(gè)包頭信息,然后再收包數(shù)據(jù)。一次收齊整個(gè)包也可以,可要對(duì)結(jié)果是否收齊進(jìn)行驗(yàn)證。這也就完成了組包過(guò)程。UDP,那你只能整包接收了。要是你提供的接收Buffer過(guò)小,TCP將返回實(shí)際接收的長(zhǎng)度,余下的還可以收,而UDP不同的是,余下的數(shù)據(jù)被丟棄并返回WSAEMSGSIZE錯(cuò)誤。注意TCP,要是你提供的Buffer佷大,那么可能收到的就是多個(gè)發(fā)包,你必須分離它們,還有就是當(dāng)Buffer太小,而一次收不完Socket內(nèi)部的讓螞鬧數(shù)據(jù),那么Socket接收事件(OnReceive),可能不會(huì)再觸發(fā),使用事件方式進(jìn)行接收時(shí),密切注意這點(diǎn)。這些特性就是體現(xiàn)了流和數(shù)據(jù)包的區(qū)別。
補(bǔ)充一點(diǎn),接收BuffSize >= 發(fā)送BuffSize >= 實(shí)際發(fā)送Size,對(duì)于內(nèi)外部的Buffer都適用,上面講的主要是Socket內(nèi)部的Buffer大小關(guān)系。
3、TCP是有多少就收多少,如果沒有當(dāng)然阻塞Socket的recv就會(huì)等,直到有數(shù)據(jù),非阻塞Socket不好等,而是返回WSAEWOULDBLOCK。UDP,如果沒有數(shù)據(jù),阻塞Socket就會(huì)等,非阻塞Socket也返回WSAEWOULDBLOCK。如果有數(shù)據(jù),它是會(huì)等整個(gè)發(fā)包到齊,并接收到整個(gè)發(fā)包,才返回。
send函數(shù)
int send( SOCKET s,const char* buf,int len,int flags);
不論是客戶還是服務(wù)器應(yīng)用程序都用send函數(shù)來(lái)向TCP連接的另一端發(fā)送數(shù)據(jù)。
客戶程序一般用send函數(shù)向服務(wù)器發(fā)送請(qǐng)求,而服務(wù)器則通常用send函數(shù)來(lái)向客戶程序發(fā)送應(yīng)答。
該函數(shù)的之一個(gè)參數(shù)指定發(fā)送端套接字描述符;
第二個(gè)參數(shù)指明一個(gè)存放應(yīng)用程序要發(fā)送數(shù)據(jù)的緩沖區(qū);
第三個(gè)參數(shù)指明實(shí)際要發(fā)送的數(shù)據(jù)的字節(jié)數(shù);
第四個(gè)參數(shù)一般置0。
這里只描述同步Socket的send函數(shù)的執(zhí)行流程。當(dāng)調(diào)用該函數(shù)時(shí),send先比較待發(fā)送數(shù)據(jù)的長(zhǎng)度len和套接字s的發(fā)送緩沖的 長(zhǎng)度,如果len大于s的發(fā)送緩沖區(qū)的長(zhǎng)度,該函數(shù)返回SOCKET_ERROR;如果len小于或者等于s的發(fā)送緩沖區(qū)的長(zhǎng)度,那么send先檢查協(xié)議 是否正在發(fā)送s的發(fā)送緩沖中的數(shù)據(jù),如果是就等待協(xié)議把數(shù)據(jù)發(fā)送完,如果協(xié)議還沒有開始發(fā)送s的發(fā)送緩沖中的數(shù)據(jù)或者s的發(fā)送緩沖中沒有數(shù)據(jù),那么 send就比較s的發(fā)送緩沖區(qū)的剩余空間和len,如果len大于剩余空間大小send就一直等待協(xié)議把s的發(fā)送緩沖中的數(shù)據(jù)發(fā)送完,如果len小于剩余 空間大小send就僅僅把buf中的數(shù)據(jù)copy到剩余空間里(注意并不是send把s的發(fā)送緩沖中的數(shù)據(jù)傳到連接的另一端的,而是協(xié)議傳的,send僅僅是把buf中的數(shù)據(jù)copy到s的發(fā)送緩沖區(qū)的剩余空間里)。如果send函數(shù)copy數(shù)據(jù)成功,就返回實(shí)際copy的字節(jié)數(shù),如果send在copy數(shù)據(jù)時(shí)出現(xiàn)錯(cuò)誤,那么send就返回SOCKET_ERROR;如果send在等待協(xié)議傳送數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開的話,那么send函數(shù)也返回SOCKET_ERROR。
要注意send函數(shù)把buf中的數(shù)據(jù)成功copy到s的發(fā)送緩沖的剩余空間里后它就返回了,但是此時(shí)這些數(shù)據(jù)并不一定馬上被傳到連接的另一端。如 果協(xié)議在后續(xù)的傳送過(guò)程中出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤的話,那么下一個(gè)Socket函數(shù)就會(huì)返回SOCKET_ERROR。(每一個(gè)除send外的Socket函數(shù)在執(zhí) 行的最開始總要先等待套接字的發(fā)送緩沖中的數(shù)據(jù)被協(xié)議傳送完畢才能繼續(xù),如果在等待時(shí)出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤,那么該Socket函數(shù)就返回 SOCKET_ERROR)
注意:在Unix系統(tǒng)下,如果send在等待協(xié)議傳送數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開的話,調(diào)用send的進(jìn)程會(huì)接收到一個(gè)SIGPIPE信號(hào),進(jìn)程對(duì)該信號(hào)的默認(rèn)處理是進(jìn)程終止。
vc tcp 發(fā)送數(shù)據(jù)庫(kù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于vc tcp 發(fā)送數(shù)據(jù)庫(kù),VC TCP 數(shù)據(jù)庫(kù)發(fā)送技巧,VC的TCP/IP通信,VC C++ send數(shù)據(jù)到網(wǎng)絡(luò)有堆包現(xiàn)象。請(qǐng)問(wèn)怎樣可以不堆包。的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
標(biāo)題名稱:VCTCP數(shù)據(jù)庫(kù)發(fā)送技巧(vctcp發(fā)送數(shù)據(jù)庫(kù))
網(wǎng)站地址:http://m.fisionsoft.com.cn/article/cocophg.html


咨詢
建站咨詢
