經常需要用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幀的位元同步 第二個欄位是幀開始定界符,表示後...