2023年12月11日 14:55:04 yiqijinbu 閱讀數:3035
tcp:面向連線的,所以在服務端繫結埠後,需要監聽listen()是否有客戶端傳送請求,有的話,accept()建立乙個新的socket物件,用於傳送和接收資訊,
就想先建造了一條高速路,再建造一輛貨車拉貨。
udp:無連線的,所以在服務端繫結埠後,不需要監聽listen(),也不用建立乙個新的socket物件用於接收傳送資訊,但是在傳送和接收時,要講本身的埠
做引數傳送給對方,這樣在交流時,對方才能確定自己。
udp協議:
client端:
static void main(string args)
:", remote.tostring());
console.writeline("收到的服務端訊息:"+encoding.utf8.getstring(bytmsgtoserve, 0, recv));
socket.close();
console.readline();
} /// /// 獲取本地ip位址資訊
///
public static string getaddressip()
}return addressip;
}
server端:
static void main(string args)
:", remote.tostring());
console.writeline("收到的資訊:-"+encoding.utf8.getstring(bytrecv, 0, intbytes));
string welcome = "welcome to my test server!";
bytrecv = encoding.ascii.getbytes(welcome);
socket.sendto(bytrecv, bytrecv.length, socketflags.none, remote);
console.readline();
}/// /// 獲取本地ip位址資訊
///
public static string getaddressip()
}return addressip;
}
當將服務層寫成window服務時,如果客戶端關閉,服務端會報錯,「遠端主機關閉了乙個現有的鏈結」,然後整個服務都停止了。
解決辦法:為socket物件設定低階操作模式
// 為 socket 設定低階操作模式,不然當客戶端關閉的時候,會報錯
uint ioc_in = 0x80000000;
uint ioc_vendor = 0x18000000;
uint sio_udp_connreset = ioc_in | ioc_vendor | 12;
socket.iocontrol((int)sio_udp_connreset, new byte , null);
另外,在window服務中,定時控制項是不能用的,但是也不報錯,不提醒,如果要定時迴圈,
解決辦法:
system.timers.timer tmrselectcom = new system.timers.timer(2000);
tmrselectcom.elapsed += new system.timers.elapsedeventhandler(tmrselectcom_tick);
tmrselectcom.enabled = true;
tcp協議:
服務端:
static void main(string args)
private static string getaddressip()
}return straddressip;
}
客戶端:
public static void main(string args)
private static string getaddressip()
}return addressip;
}
tcp圖:
udp圖:
socket通訊收到rst指令問題
現象為客戶端連線服務端,服務端日誌返回寫socket成功,但是客戶端報錯 read socket error 把能調的超時時間都調大了,但是還是報錯 抓包結果服務端 抓包結果客戶端 分析原因 1 可以看到客戶端是傳送完請求後,收到rst指令,導致連線斷開 客戶端新增日誌列印errno if num ...
socket通訊程式設計
1 socket通訊模型如下 應用程式通過套接字可以進行通訊,可以使用udp協議或者使用tcp協議,當客戶端和伺服器端的協議時相對應的,客戶端使用tcp,那麼伺服器端使用tcp 2 udp協議 把資料打包成資料報,然後直接傳送對應的ip位址,速度快,但是不保證 成功率,並且資料大小有限 tcp協議 ...
Socket通訊基礎
socket通訊傳遞資料 服務端 using system.net using system.net.sockets using system.text using system.threading thread mythread socket socket 清理所有正在使用的資源。protecte...