由於平時使用unity開發,所以相對其他的程式語言,對c#比較了解,所以寫了乙個c/s的socket非同步通訊程式。目前只是在c#中測試,未來會接入unity3d,這個只是我個人用來進行學習用的,所以大家不必在意使用哪個語言做後端伺服器開發更好
一些說明:
1.伺服器連線池
classview codeconn
//初始化
public
void
init(socket socket)
//快取區剩餘的位元組
public
intbuffremain()
//獲取客戶端的位址
public
string
getaddress()
//關閉
public
void
close()
}
2.伺服器socket
classview codeunityserver
else
if(conns[i].isuse == false
)
}return -1
; }
//開啟伺服器
public
void
start(ipendpoint ipendpoint)
//socket
listensocket = new
socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
//bind
listensocket.bind(ipendpoint);
//listen
listensocket.listen(maxcount);
//accept
listensocket.beginaccept(acceptcb, null
); }
//accept**函式
private
void
acceptcb(iasyncresult asyncresult)
else
}catch
(exception ex)
}//receive**函式
private
void
receivecb(iasyncresult asyncresult)
//資料處理
string str = conn.socket.remoteendpoint.tostring() +"
:" + encoding.utf8.getstring(conn.readbuff, 0
, count);
console.writeline("[
" + conn.getaddress() + "
] :
" +str);
byte sendmsg =encoding.utf8.getbytes(str);
//將所有的訊息廣播
for(int i=0;i)
//繼續接收
conn.socket.beginreceive(conn.readbuff, conn.buffcount, conn.buffremain(), socketflags.none, receivecb, conn);
}catch
(exception ex)
}
}
3.伺服器main函式
classview codeprogram}}
4.客戶端socket
classview codeprogram
catch
(exception ex)
finally
console.readkey();}}
5.測試結果
啟動伺服器,注意埠號和ip位址
啟動客戶端,伺服器顯示有客戶端連線上來(0個客戶端是因為是0開始計數的)
總結:這只是乙個簡單的socket測試demo,如果要用於真正的通訊,就需要考慮封裝協議、加密資料、網路異常處理、伺服器負載、高併發能力等,後續會繼續學習如何完成乙個小型的unity遊戲伺服器
C SOCKET通訊模型(七)非同步epoll
不得不說為這非同步epoll模型還真是傷了神。主要問題就是在libaio的核心通知上,因為這東西實在太低階了,用起來還比較麻煩。我為了不再多開執行緒,實現和iocp基本相同的原理,在proc內部又用了次epoll,使其核心通知和使用者通知都能在乙個執行緒中得到相同處理。並且用map對映eventfd...
C Socket非同步通訊客戶端之傳送資料
c socket非同步通訊客戶端之主程式 c sharp public static int main string args response release the socket.client.shutdown socketshutdown.both client.close return 0 ...
C Socket通訊例子
建立兩個工程檔案,server和client include include pragma comment lib,ws2 32.lib 靜態加入乙個lib檔案 pragma warning disable 4996 using namespace std intmain 繫結ip和埠 配置監聽位址...