導航:首頁 > 網路數據 > csocketsend大數據

csocketsend大數據

發布時間:2022-12-16 07:09:46

① 我在使用CSocket::Send(字元,長度);發送數據的時候,怎樣把握長度的設置怎麼才能得到長度的最大值

可以使用多線程傳送同時設置緩沖區大小
3.在send(),recv()過程中有時由於網路狀況等原因,發收不能預期進行,而設置收發時限:

int nNetTimeout=1000;//1秒
//發送時限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收時限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

4.在send()的時候,返回的是實際發送出去的位元組(同步)或發送到socket緩沖區的位元組
(非同步);系統默認的狀態發送和接收一次為8688位元組(約為8.5K);在實際的過程中發送數據
和接收數據量比較大,可以設置socket緩沖區,而避免了send(),recv()不斷的循環收發:

// 接收緩沖區
int nRecvBuf=32*1024;//設置為32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//發送緩沖區
int nSendBuf=32*1024;//設置為32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

5. 如果在發送數據的時,希望不經歷由系統緩沖區到socket緩沖區的拷貝而影響
程序的性能:

int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));

6.同上在recv()完成上述功能(默認情況是將socket緩沖區的內容拷貝到系統緩沖區):

int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));

② 請問用MFC 裡面的CSocket 建立長連接模式的TCP/IP通信傳輸數據的時候步驟是怎麼樣的

你看一下send函數調用的返回值,返回值會告訴你為什麼沒有發送成功.如果發送成功,send的返回值應該是要發送的數據的位元組數

③ c#socket怎麼傳輸大數據

constintblockLength=512*1024;
publicvoidSendFile(stringfilePath,NetworkStreamstream)//發送文件
{
//傳輸內容
using(FileStreamfs=File.Open(filePath,FileMode.Open))
{
intreadLength=0;
byte[]data=newbyte[blockLength];

//發送大小
byte[]length=newbyte[8];
BitConverter.GetBytes(newFileInfo(filePath).Length).CopyTo(length,0);
stream.Write(length,0,8);

//發送文件
while((readLength=fs.Read(data,0,blockLength))>0)
{
stream.Write(data,0,readLength);
}
}

}

publicboolReceiveFile(stringfileName,NetworkStreamstream)//接收文件
{
try
{
longcount=GetSize(stream);
if(count==0)
{
returnfalse;
}
longindex=0;
intcurrentBlockLength=0;
intreceivedBytesLen=1;
using(FileStreamfs=newFileStream(fileName,FileMode.OpenOrCreate))
{
while(receivedBytesLen>0&&index<count)
{
byte[]clientData=newbyte[blockLength];
receivedBytesLen=0;

if(blockLength<count-index)
{
currentBlockLength=blockLength;
}
else
{
currentBlockLength=(int)(count-index);
}
receivedBytesLen=stream.Read(clientData,0,currentBlockLength);
fs.Write(clientData,0,receivedBytesLen);
index+=receivedBytesLen;
}
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
returnfalse;
}
returntrue;
}

privateintGetSize(NetworkStreamstream)//獲取文件大小
{
intcount=0;
byte[]countBytes=newbyte[8];
try
{
if(stream.Read(countBytes,0,8)==8)
{
count=BitConverter.ToInt32(countBytes,0);
}
else
{
return0;
}
}
catch
{
return0;
}
returncount;
}

④ C 語言socket 的send數據太大,最大能發送多少如何分批發送

如果你SOCKET發的數據報,比如UDP協議, 那麼是有最大可發送大小.

這可以用下面這樣getsockopt取得最大數據報大小.
----------------------------------------
SOCKET s;
int iSize, iVal, ret;

.....
iSize = sizeof(iVal);
ret = getsockopt(s, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&iVal, &iSize);

//-----------------------------------------
如果是TCP,則不需要這樣做.

你send返回的位元組數有801770個位元組(是位元組數吧!),和send里的規定length一樣大,這可以表明你成功的將這些數據提交底層TCP協議棧去發送。

接收方要是處理成確的,是可以正確無誤的收到這些數據的。

//---------------------------------------------

TCP 提供的是可靠的數據流服務 , 這意味著, 接收方,並不需要關心也不應該假定發送方調用了多少次SEND, 它只需要管的是通過若干次RECV把數據從協議棧的緩沖區讀取出來。
TCP不必擔心丟數據,但發送的時候,SEND要注意處理返回值,如果是阻塞方式,太多的數據會被阻塞, 如果是非阻方式,返回緩沖區滿錯,然後延時重發。

⑤ socket怎麼分段傳輸大數據

算了,抄我給你舉個例子吧。我猜你也一襲下子想不出什麼完整的描述。

比如說你傳送一個視頻,比如說原來是
var cmd = new Media{ bytes= data, object_id="123133213"};

那麼你現在可以傳
var cmd = new MediaPart{ bytes= data, object_id="123133213", position=77844};

由於它們都有object_id,因此知道目標是什麼。所不同的,後者在傳送之前,你可能需要首先聲明一下 123133213 號對象的完整的長度,這樣伺服器端每當接收到(多個) MediaPart 的時候就可以判斷是否已經接收完全了,一旦接收到完整數據,才開始下一步處理。

⑥ c# socket傳送大數據總是截斷

8192=8*1024. 你這是8K的數據,偏小。一般不會是服務端的大小限制。既然序列化和反序列都是你自己發送、接受。跟蹤一下兩端的異常信息才可以進一步判斷

⑦ 如何解決大數據量發送時 send 阻塞的問題

自己設置一個緩沖區,把待發的數據放在緩沖里,取出一個來發,發完後再取下一個。MFC的CSocket有源碼,可以看一下它的Send 是怎麼實現的。

⑧ 怎樣連續獲得CSocket中的數據

然後客戶端連續發消息,用csocket::send函數即可 服務端接收消息,用csocket::receive 函數即可 最好是客戶端和服務端都使用重載csocket類的對象 onreceive是接收函數響應消息,只要有東西傳它就自動響應 最好在網上下一個例子看以下把

⑨ CSocket類的Send()函數問題:連續發送多次為什麼只收到一次

樓主可能沒搞清楚,當每個socket建立後會有一個發送緩沖區和一個接收緩沖區,windows系統默認是8KB,send調用成功以後數據並沒有立即發出去,而只是把發送的數據復制到發送緩沖區,由操作系統底層實現發送功能,發送到接受端的接收緩沖區。為了減輕網路負擔,一般的TCP鏈接用了nagle演算法,並不是發送緩沖區有數據就會發送的。
對於接收端來說,receive(char *buf,num)只是從接收緩沖區裡面取數據,返回的值就是取得的數據大小。你多次send,如果數據量不大,而num的值超過了發送的總值,那麼就會一次取完接受緩沖區的數據。
不知道這樣解釋樓主清楚了沒有。

⑩ socket發送大數據如何分包發送問題

粘包、分包、解包

參考版下面權: http://blog.csdn.net/sqldebug_fan/article/details/20465455

閱讀全文

與csocketsend大數據相關的資料

熱點內容
城市天際線win10 瀏覽:813
運動APP跑步如何抓作弊 瀏覽:57
微信中秋節動態祝福語 瀏覽:703
練英語的網站哪個好 瀏覽:894
科來網路分析系統報價 瀏覽:437
哪裡可以上傳自己的php網站 瀏覽:373
安卓手機如何打開zx文件 瀏覽:531
app攻擊是什麼 瀏覽:888
app上有把鎖是什麼意思 瀏覽:611
如何用c語言編程五角星 瀏覽:183
thinkpadwin10一鍵恢復 瀏覽:498
excel資料庫的數據結構是樹形嗎 瀏覽:225
templatewebjs下載 瀏覽:774
note3應用程序未安裝 瀏覽:714
dos看圖工具 瀏覽:15
微信直接加為好友 瀏覽:467
可以用微信傳送的文件app 瀏覽:294
pdf文件解析亂碼 瀏覽:479
光照無關圖代碼 瀏覽:688
Linux讀寫文件前八位 瀏覽:597

友情鏈接