C Socket非同步通訊

2022-08-31 12:42:09 字數 2455 閱讀 9045

由於平時使用unity開發,所以相對其他的程式語言,對c#比較了解,所以寫了乙個c/s的socket非同步通訊程式。目前只是在c#中測試,未來會接入unity3d,這個只是我個人用來進行學習用的,所以大家不必在意使用哪個語言做後端伺服器開發更好

一些說明:

1.伺服器連線池

class

conn

//初始化

public

void

init(socket socket)

//快取區剩餘的位元組

public

intbuffremain()

//獲取客戶端的位址

public

string

getaddress()

//關閉

public

void

close()

}

view code

2.伺服器socket

class

unityserver

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)

}

}

view code

3.伺服器main函式

class

program}}

view code

4.客戶端socket

class

program

catch

(exception ex)

finally

console.readkey();}}

view code

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和埠 配置監聽位址...