c的socket程式設計中,怎麼獲取接受到得資料長度

時間 2021-10-14 21:29:01

1樓:匿名使用者

......直接讀成二進位制流,在接收端或者說伺服器端接收到二進位制流後 以同樣的型別進行轉換就好

看下這個方法.將陣列型別讀取為二進位制流

private byte serializeonlinelist()

iformatter format = new binaryformatter();

memorystream stream = new memorystream();

format.serialize(stream, onlinelist);

byte ret = stream.toarray();

stream.close();

return ret;

}而這是接收端的行為

byte onlinebuff = new byte[_maxpacket];

int bytecnt = _nws.read(onlinebuff, 0, onlinebuff.length);

iformatter format = new binaryformatter();

memorystream stream = new memorystream();

stream.write(onlinebuff, 0, bytecnt);

stream.position = 0;

stringcollection onlinelist = (stringcollection)format.deserialize(stream);

其它型別都可以這樣進行轉換.stringcollection只是一個型別,你可以利用任何型別進行同樣的操作 ...至於怎麼傳送資料這個不用我說了吧.

networkstream 本身有write和read方法貌似

1.簡單伺服器端

//using system.data;

//using system.net.sockets;

//using system.net;

//using system.threading;

int port=%%2;

private thread ththreadread;

private tcplistener tcplisten;

private bool blistener=true;

private socket stread;

void listen()

}catch(security.securityexception)

}ththreadread=new thread(new threadstart(listen));

ththreadread.start();

2.簡單客戶端

//using system.data;

//using system.net.sockets;

//using system.net;

int port=%%1;

private tcpclient tcpc;

private socket stsend;

private bool tcpconnect=false;

trycatch(exception)

int ilength=%%3.length;

byte bysend=new byte[ilength];

bysend=system.text.encoding.default.gebytes(%%3);

int retval=stsend.send(bysend);

}protected override void dispose(bool disposing)

if(disposing && component!=null)

}base.dispose(disposing);

}3.獲得本機ip

//using system.net;

ipaddress addresslist = dns.gethostbyname(dns.gethostname()).addresslist;

string s=null;

for (int i = 0; i < addresslist.length; i++)

%%1=s;

2樓:日拱一卒行則將至

//測試url程式 客戶端和伺服器端在後面public class testurl

}客戶端程式

public class clientdemobrsocket.close();

pw.close();

br.close();

socket.close();}}

服務端程式

public class serverdemobrin.close();

in.close();

pw.close();

server.close();

socket.close();}}

3樓:**天道

tcpclient clientsocket = null;

networkstream ns = null;

streamreader sr = null;

streamwriter sw = null;

bool connected = false;

private void connecttoserver(object myobject)

}else

}catch }}

private void receivechat()}catch}

4樓:

建議參照http協議自己設定頭資訊,不然不可能未卜先知的得到整個流中資料的長度

關於c#,100分+相送。c#中socket程式設計中,怎麼獲取接受到得資料長度

5樓:匿名使用者

這個.一般都是建立一個緩衝區

byte buffer = new byte[1024];

然後通過read迴圈去填充緩衝區的.直到read到buffer中的為null了..

最後你可以通過總的接受到的資料得到長度.不要妄想在接收完之前能得到資料長度.不現實的.

6樓:編號

伺服器端向客戶端傳送檔案之前,可以先向客戶端傳送一個資料大小的值。否則只能累計分包值得到檔案資料最終長度

receive方法中的幾個過載都是什麼啊

------------------------------------

完全可以自己看msdn

socket.receive (byte) 從繫結的 socket 套接字接收資料,將資料存入接收緩衝區。

由 .net compact framework 支援。

socket.receive (泛型 ilist) 從繫結的 socket 接收資料,將資料存入接收緩衝區列表中。

socket.receive (byte, socketflags) 使用指定的 socketflags,從繫結的 socket 接收資料,將資料存入接收緩衝區。

由 .net compact framework 支援。

socket.receive (泛型 ilist, socketflags) 使用指定的 socketflags,從繫結的 socket 接收資料,將資料存入接收緩衝區列表中。

socket.receive (byte, int32, socketflags) 使用指定的 socketflags,從繫結的 socket 接收指定位元組數的資料,並將資料存入接收緩衝區。

由 .net compact framework 支援。

socket.receive (泛型 ilist, socketflags, socketerror) 使用指定的 socketflags,從繫結的 socket 接收資料,將資料存入接收緩衝區列表中。

socket.receive (byte, int32, int32, socketflags) 使用指定的 socketflags,從繫結的 socket 接收指定的位元組數,存入接收緩衝區的指定偏移量位置。

由 .net compact framework 支援。

socket.receive (byte, int32, int32, socketflags, socketerror) 使用指定的 socketflags,從繫結的 socket 接收資料,將資料存入接收緩衝區。

7樓:強女幹未遂被日

函式原型:

public int receive (byte[ ] buffer, int size, socket flagssocketflags)

引數:buffer 表示接收到的資料的儲存位置;size表示要接收資料的大小;socketflagst提供socket訊息的常數值,具有允許按位組合其成員值的屬性。返回值為傳送到socket的位元組數。

c# socket 如何完全傳送/接收資料

8樓:大野瘦子

傳送:private void button2_click(object sender, eventargs e)

catch}}

接收:system.timers.timer atimer = new system.timers.timer();

byte res = new byte[1024];

private void form1_load(object sender, eventargs e)

void timermange()

private void socket_rev(object sender, eventargs e)}

9樓:匿名使用者

比如b1:1-100是一個“資料包”,b2:0是一個“資料包”,每次傳送以“資料包”為單位傳送,“資料包”中包含“開始”和“結束”的標記,那麼 傳送端 b1,b2的執行可以想象成 資料包b1:

b1開始+1~100+b1結束,資料包b2:b2開始+0+b2結束,接受端 接受到資料包b1的"b1開始"標記時,建立b1執行緒,b1執行緒接受到1~10時,接受端 接受到資料包b2的"b2開始"標記,建立b2執行緒,b2執行緒接受0,b2執行緒接受"b2結束"標記,釋放b2執行緒,同時b1執行緒接受到11~100和"b1結束"標記釋放b1執行緒。

文字描述的不是很給力,**例子看看,希望能讓你明白。

10樓:匿名使用者

存在情況:

1、 接收端迴圈沒寫好

2、沒有讀完網路流(快取可以設大些,或判斷是否讀到完所有的位元組)建議要一次發完所有資料 可以先將100個數字拼接成字串,然後傳送一次 。字串頭可加入[length=***]其中***是實際傳送的字串長度(注意不是位元組陣列buffer的長度),那麼對於上面的請求,則我們傳送的資料為:“[length=9]1,2,23,54”。

而服務端接收字串之後,首先讀取這個“後設資料”的內容,然後再根據“後設資料”內容來讀取實際的資料。取得內空後就可以拆分成數字

C程式設計中怎麼獲取觸控螢幕的事件,C 程式設計中怎麼獲取觸控螢幕的事件

觸控螢幕是乙個單獨的事件獲取程式,手指的運作代替的是滑鼠的運作.這一點上和筆記本的觸板是一樣的,你根不用不著考慮加寫觸板的事件委託.而你自己寫的程式其實就是普通程式.只是在帶觸控螢幕的電腦上由手指代替滑鼠操作.你補充的問題,從左向右劃一下,這個我沒寫過,不過從事件本身來看應該是捕獲滑鼠的起點和終點座...

c 中怎麼獲取陣列中元素的個數

物理公司的 c 中陣列可分為堆區的陣列和棧區的陣列,對於兩種陣列c 都沒有函式可以直接獲取陣列的元素的個數。一 堆區的陣列 堆區的陣列是自己申請的,比如用new申請空間 int arr new int 10 堆區的陣列不能計算出包含元素個數。二 棧區的陣列 棧區的陣列是系統自動分配的,如 cpp v...

c如何程式設計返回上一級目錄,c 如何獲取可執行檔案路徑的上上級目錄

返回上一級目錄的 如下 string path directory.getcurrentdirectory directory.setcurrentdirectory path 當前目錄 返回 string strpath directory.getcurrentdirectory 將當前目錄儲存到...