Linux下網絡編程實(shi)現(xian)UDP,還有大(da)量實(shi)例
時(shi)間:2018-08-15 來源(yuan):未(wei)知(zhi)
【1】概念
【2】程序流程
【3】相(xiang)關函數
1)創建套接字
2)綁定網絡信息結構體
3)接受(shou)數據
4)發送數據
【4】項目:基于udp 的網(wang)絡聊天室(shi)
【1】概念
UDP(User Datagram Protocol即(ji)用戶數據報協議):面向無連接的,不可靠的,不保(bao)證分組(zu)順序到(dao)達的網絡服(fu)務
【2】程序流程
(1)服務器(qi):
創建套接字 socket( )
填充服務器網絡信(xin)息(xi)結構(gou)體 sockaddr_in
將套接字與服務器網(wang)絡信息(xi)結構體綁定(ding) bind( )
進行(xing)通(tong)信(xin) recvfrom( )/sendto( )
(2)客戶(hu)端:
創(chuang)建(jian)套接字(zi) socket( )
填充服務器網絡(luo)信息結構(gou)體 sockaddr_in
進行通信 sendto( )/recvfrom( )
使(shi)用socket創建sockfd時應使(shi)用SOCK_DGRAM 數據報套接字 udp
shell指(zhi)令 nc 選(xuan)項 服務器(qi)的(de)IP地址 端口(kou)號(客戶端)加 -u 代(dai)表UDP 不加代(dai)表TCP
加 -l 代表服務器 不(bu)加代表客戶(hu)端
模擬的是回聲服務器作用
【3】相關函數
1)創建套(tao)接(jie)字(zi)


2)綁定網(wang)絡信息(xi)結(jie)構(gou)體



3)接受數據


注意:與accept類似,在定義socklen_t addrlen =sizeof(struct sockaddr); 取(qu)地(di)址傳參,必(bi)須(xu)先初始化,在不(bu)對len進行(xing)初始化時,recvfrom第一次接(jie)受的(de)數據(ju)(ju),內(nei)(nei)核(he)處(chu)理(li)會根據(ju)(ju)當前(qian)len值(zhi)即亂碼進行(xing)數據(ju)(ju)處(chu)理(li),得(de)到的(de)地(di)址信息結構(gou)體(ti)數據(ju)(ju)也為亂碼。之后(hou),內(nei)(nei)核(he)知曉地(di)址信息結構(gou)體(ti)大小,會對len值(zhi)進行(xing)修(xiu)改(gai),即第二(er)次之后(hou)得(de)到的(de)地(di)址信息結構(gou)體(ti)為正(zheng)確的(de)。未初始化時,如果變(bian)量內(nei)(nei)值(zhi)為正(zheng)數,則可以正(zheng)常(chang)輸出(chu),但(dan)(dan)值(zhi)不(bu)正(zheng)確,但(dan)(dan)若變(bian)量內(nei)(nei)值(zhi)為負值(zhi),內(nei)(nei)核(he)無法處(chu)理(li),則會直接(jie)報(bao)錯。
4)發送數據


【4】項目:基于udp 的網絡聊天室(shi)
功能:
當有人登陸時(shi)(shi),其他(ta)在線(xian)的(de)(de)人可(ke)(ke)以收到這(zhe)(zhe)個人的(de)(de)登錄信息(xi)當有人發消息(xi)時(shi)(shi),其他(ta)在線(xian)用戶可(ke)(ke)以接受到這(zhe)(zhe)個信息(xi)當有人退出(chu)時(shi)(shi),其他(ta)人可(ke)(ke)以收到這(zhe)(zhe)個人的(de)(de)退出(chu)信息(xi)服務器(qi)可(ke)(ke)以發送系統信息(xi)
服務器端:

如何實現端對端的通信:
由服務(wu)器通(tong)知在線人員,然后客戶端選擇與誰通(tong)信
可(ke)以在服務(wu)器(qi)的(de)存儲鏈表(biao)中增加一(yi)個(ge)成員變量,用(yong)來標(biao)識每一(yi)個(ge)成員,而后根(gen)據客(ke)戶端的(de)選擇(ze)進行通信在服務(wu)器(qi)發(fa)(fa)送(song)消(xiao)息(xi)的(de)功(gong)能中,首先判(pan)斷客(ke)戶端是(shi)(shi)發(fa)(fa)送(song)單聊(liao)(liao)或(huo)是(shi)(shi)群(qun)聊(liao)(liao)
服務器:





