乙個讀取乙太網裝置的資料的socket

2022-01-13 13:21:21 字數 2366 閱讀 9239

經常需要用socket讀取裝置的資料,包括現在很多串列埠轉乙太網的東西,需要傳送資料事先定義好的位元組資料,然後等待返回位元組資料。傳送和接收的資料往往是固定長度,並且短時間要收到回覆的。於是就手動做這麼乙個簡單的類。

使用方法很簡單,new 乙個socketclient同時定義好ip和埠,直接send(資料,超時時間,返回的資料長度),然後返回retdata,這裡表明了返回是否成功,接收到的長度和資料

using system;

using system.collections.generic;

using system.linq;

using system.net;

using system.net.sockets;

using system.text;

using system.threading;

using system.threading.tasks;

namespace common

//建立 1個客戶端套接字 和1個負責監聽服務端請求的執行緒

socket socketclient = null;

thread threadclient = null;

public eventhandler evennewdata;

string ip = "127.0.0.1";

int port = 8888;

public bool connected }

byte databuf = new byte[1024 * 1024];

//定義乙個1m的記憶體緩衝區 用於臨時性儲存接收到的資訊

public byte data }

//預設為0表示不檢測接收資料長度,如果不為0表示資料接收超過這個長度才會觸發接收完成事件

int _rcvdatalength = 0;

//最大長度1024*1024

public int fixrcvlength set }

retdata result;

public bool connecttoserver()

catch (exception ex)

}return socketclient.connected;

}public void disconnectfromserver()

/// /// 接收服務端發來資訊的方法

///

private void recmsg()

result.revlength = 0;}}

}/// /// 傳送資料並等待返回資料

///

/// 傳送的字串資料

/// 等待的超時毫秒,如果超過時間還沒收到返回指定的資料長度,則返回讀取錯誤

/// 等待返回的資料長度,0表示不管多長都返回

///

public retdata send(string sendmsg, int monitortime, int returnbytes = 0)

/// /// 傳送資料並等待返回資料

///

/// 傳送的資料

/// 等待的超時毫秒,如果超過時間還沒收到返回指定的資料長度,則返回讀取錯誤

/// 等待返回的資料長度,0表示不管多長都返回

///

public retdata send(byte sendmsg, int monitortime, int returnbytes = 0)

if (connected)

else

monitor(monitortime);

}else

return result;

}/// /// 傳送資料並等待返回資料

///

/// 傳送的資料

/// 等待的超時毫秒,如果超過時間還沒收到返回指定的資料長度,則返回讀取錯誤

/// 等待返回的資料長度,0表示不管多長都返回

///

public tasksendasync(byte sendmsg, int monitortime, int returnbytes = 0));}

int monitortime = 0;

private void monitor(int monitortime)

result.message = "time out";

}~socketclient()

}[serializable]

public class retdata

= false;

public byte data

public string message

public int code = 0;

public int revlength = 0;

}}

乙太網資料的封裝

我們在上一文中介紹了乙太網5層模型,這一節我想學習一下乙太網資料封裝與解封的知識,了解乙太網資料是如何傳輸的。一 資料封裝 當我們應用程式用tcp傳輸資料的時候,資料被送入協議棧中,然後逐個通過每一層,知道最後到物理層資料轉換成位元流,送入網路。而再這個過程中,每一層都會對要傳送的資料加一些首部資訊...

乙個簡單的工業乙太網協議實現

三 初始化函式 四 上層和頂層之間的轉換函式 基於winpcap和c 首先需要定義資料幀的格式,這裡為了簡便設為 目的mac 6位元組 源mac 6位元組 型別 2位元組 資料 crc32 4位元組 為了傳送和接受資料幀,設定兩個結構體,乙個用來傳送資料幀 給底層的 乙個用來儲存資料幀 給上層或使用...

乙太網的MAC幀(一)

乙太網mac幀格式有兩種標準 dix ethernet v2標準和ieee 802.3標準。dix乙太網v2標準的幀格式如圖 前導碼 使接收端與傳送端時鐘同步,在幀的前面插入的8位元組,可再分為兩欄位 第乙個欄位共7位元組,是前同步碼,用來迅速實現mac幀的位元同步 第二個欄位是幀開始定界符,表示後...