1.呼叫
intsend(__insockets,__inconstchar*buf,__inintlen,__inintflags);
發出的資料報,在傳送過程中,雖然順序不會把打亂,但可能會拆分成多個包,這樣,只呼叫一次
intrecv(__insockets,__outchar*buf,__inintlen,__inintflags);
可能不能被完整地接收。
解決的方法是,定義tcp
之上的協議,即應用層協議,指示資料報長度。最簡單的實現為:
void sendfn(socket s, char* data, int len)
//完整接收指定長度資料報
void recvfns(socket s, char* buff, int len)
void recvfn(socket s)
}
2.tcp
通訊時,伺服器用
socketaccept(__insockets,__outstructsockaddr*addr,__inoutint*addrlen);
建立的套接字共同占用乙個埠,即伺服器監聽埠。
為什麼要這麼做:客服端套接字指定通訊對方的埠就是監聽埠,沒有理由找乙個使用其它埠的套接字跟它連線。
為什麼能這麼做:tcp
報文中,包含源埠,與目標埠,再加上
ip層的源
ip位址及目標
ip位址,這四個資訊,就是運輸層多路分解中,所需要的四元組,意思是可以唯一確定乙個
tcp連線。當從
ip層,解包資料後,就可以根據四元組,找到這些資料的目標
tcp連線。這點跟
udp連線是有區別的,因為
udp多路分解時只使用目標
ip位址及目標埠,所以,只要目標
ip為本機
ip,目標埠為監聽埠的,
udp連線都會定向到乙個
upd連線。這意味,
udp是乙個一對多的連線(確切地說
upd不能叫連線)。
3.阻塞套接字可以在recv
的同時,呼叫
send。
4.互答通訊模式(時間緊,未仔細考慮非阻塞模式)。互答通訊指的是,雙方都可能主動地向對方發請求。這意味著雙方都必須實時監聽著對方的請求。監聽是會阻塞執行緒的,所以程式不可能是單線的(羅雲彬書上聊天室例子介紹了互答通訊的解決方案,而且用的是單執行緒,但其實在模擬多執行緒,而且在多回合會話中,整個流程很難被維護)。再考慮如何使用連線。同乙個套接字雖然可以在recv
同時呼叫
send
,但不能同時呼叫
recv
,因為多個執行緒會搶奪資料,導致混亂。只使用乙個套接字,這種情況是會發生的,比如,監聽執行緒呼叫
recv
堵在那時,其它執行緒呼叫
send
後,又用
recv
來等待對方的回應,這時就有衝突了。所以套接字至少要有兩個。乙個用於被動會話(監聽),乙個用於主動會話。
5.socket型別是乙個控制代碼,有點指標的性質,並且
accept
會分配socket
物件,所以可以看成在堆上的指標,直接傳給新執行緒當引數:
client = ::accept(s, (sockaddr*)&remoteaddr, &naddrlen);
if(client == invalid_socket)
continue;
_beginthreadex(null, null, sserverthread, &client, null, null);//不存在缺陷,因為socket是控制代碼,相當於指標,typedef uint_ptr socket;
6.位元組順序。只有與網路協議棧本身的資料的位元組順序是與主機的相反的,自己的資料,傳送出去是什麼樣,接受後就是什麼樣。位元組倒序,是以位元組為單位:如
0x1234
倒序後成
0x3412
7.win+r執行
perfmon.msc
可以檢視網路連線狀況。
套接字網路程式設計筆記
1.呼叫 int send in socket s,in const char buf,in int len,in int flags 發出的資料報,在傳送過程中,雖然順序不會把打亂,但可能會拆分成多個包,這樣,只呼叫一次 int recv in socket s,out char buf,in i...
網路套接字程式設計
1。位元組序 小位元組 低位儲存在低位元組 大位元組 低位儲存在高位元組 簡單程式判斷 int islittle 2.hostent結構 struct hostent define h addr h addr list 0 這裡是這個資料結構的詳細資料 struct hostent h name 位...
網路程式設計套接字
建立 函式原型 int socket int domain int type int protocol 引數說明 domain 協議域,又稱協議族 family 常用的協議族有af inet af inet6 af local 或稱af unix,unix域socket af route等。協議族決...