新聞中心
實(shí)現(xiàn)UDP聊天,附Linux代碼

創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供雅安企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為雅安眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
近年來(lái),隨著互聯(lián)網(wǎng)和移動(dòng)設(shè)備的普及,聊天工具成為了人們?nèi)粘I詈凸ぷ鞑豢苫蛉钡囊徊糠?,而其中UDP協(xié)議在實(shí)現(xiàn)輕量級(jí)即時(shí)通訊方面發(fā)揮著重要的作用。本文將詳細(xì)介紹如何通過(guò)UDP協(xié)議在Linux系統(tǒng)下實(shí)現(xiàn)簡(jiǎn)單的聊天功能,并附上相關(guān)代碼。
一、UDP介紹
UDP(User Datagram Protocol)用戶(hù)數(shù)據(jù)報(bào)協(xié)議是一種無(wú)連接的傳輸層協(xié)議,它不保證可靠性和完整性,但可以快速進(jìn)行數(shù)據(jù)傳輸,因此常用于實(shí)時(shí)性較強(qiáng)的應(yīng)用場(chǎng)景,例如音視頻傳輸、視頻游戲等。與TCP協(xié)議相比,UDP沒(méi)有建立連接和拆除連接的過(guò)程,傳輸速度更快且開(kāi)銷(xiāo)更??;但UDP也缺少數(shù)據(jù)包的確認(rèn)和重傳機(jī)制,容易發(fā)生丟包現(xiàn)象。
二、UDP聊天實(shí)現(xiàn)過(guò)程
1.初始化
在使用UDP協(xié)議進(jìn)行通信前,必須進(jìn)行一些初始化工作。下面的函數(shù)完成對(duì)socket的初始化,本例使用的是IPv4:
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd
perror(“Error opening socket\n”);
exit(1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
2.發(fā)送數(shù)據(jù)
使用UDP協(xié)議發(fā)送數(shù)據(jù)時(shí),需要指定目標(biāo)主機(jī)的IP地址和端口號(hào)。下面的函數(shù)可以實(shí)現(xiàn)將數(shù)據(jù)發(fā)送到目標(biāo)地址:
sendto(sockfd, (const char *)msg, strlen(msg), MSG_CONFIRM, (const struct sockaddr *) &cliaddr,
sizeof(cliaddr));
其中,msg為要發(fā)送的消息,cliaddr包含目標(biāo)主機(jī)的IP和端口號(hào)。
3.接收數(shù)據(jù)
使用UDP協(xié)議接收數(shù)據(jù)時(shí),需要設(shè)置套接字為非阻塞模式,以避免進(jìn)程被掛起。下面的函數(shù)可以實(shí)現(xiàn)從指定端口號(hào)接收數(shù)據(jù):
n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WTALL, (struct sockaddr *) &cliaddr,
&len);
其中,buffer為接收數(shù)據(jù)的緩沖區(qū),MAXLINE為緩沖區(qū)的大小,cliaddr為接收地址信息。
4.綁定端口
在使用UDP協(xié)議進(jìn)行通信時(shí),需要為套接字綁定一個(gè)端口號(hào)。在下列代碼中,我們使用固定的端口號(hào),但也可以隨機(jī)選擇一個(gè)端口號(hào):
if ((bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)))
perror(“Error binding to socket\n”);
exit(1);
}
因?yàn)閁DP協(xié)議是無(wú)連接的,所以多個(gè)進(jìn)程可以通過(guò)同一個(gè)端口號(hào)進(jìn)行通信。但如果多個(gè)進(jìn)程綁定到同一個(gè)端口號(hào),則只有最后一個(gè)進(jìn)程能夠接收到數(shù)據(jù)包。
三、完整代碼實(shí)現(xiàn)
下面是一個(gè)運(yùn)行良好的UDP聊天程序,它能夠?qū)崿F(xiàn)雙方之間的交互。需要注意的是,該程序是基于Linux系統(tǒng)開(kāi)發(fā)的,Windows環(huán)境下需要進(jìn)行相應(yīng)的修改:
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 8080
#define MAXLINE 1024
int mn() {
int sockfd;
char buffer[MAXLINE];
char *hello = “Hello from server”;
struct sockaddr_in servaddr, cliaddr;
// Creating socket file descriptor
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd
perror(“socket creation fled”);
exit(EXIT_FLURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
// Filling server information
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// Bind the socket with the server address
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr))
perror(“bind fled”);
exit(EXIT_FLURE);
}
int len, n;
len = sizeof(cliaddr); //len is value/result
while (1) {
n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WTALL, (struct sockaddr *)&cliaddr,
&len);
buffer[n] = ‘\0’;
printf(“Client : %s\n”, buffer);
if (strcmp(buffer, “exit”) == 0) {
printf(“Client Exit…\n”);
break;
}
printf(“Server : “);
fgets(buffer, MAXLINE, stdin);
sendto(sockfd, (const char *)buffer, strlen(buffer), MSG_CONFIRM, (const struct sockaddr *)&cliaddr,
len);
if (strcmp(buffer, “exit\n”) == 0) {
printf(“Server Exit…\n”);
break;
}
bzero(buffer, MAXLINE);
}
close(sockfd);
return 0;
}
四、
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專(zhuān)注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220關(guān)于linux下udp的問(wèn)題…
很想幫你但力不從心啊。頂
首先:udp是不需要accept的,因?yàn)樗皇沁B接的,不需要accept;
也就衫塵宏是說(shuō)你在bind好了過(guò)后就直接while(1)就可以了。
這個(gè)里面用的函數(shù)有些變化,發(fā)送用 sendto, 接收用 recvfrom
這兩個(gè)函數(shù)你可以直接在終端下面輸入: man sendto 以及 man recvfrom查看他們或冊(cè)的參數(shù)以及返兄和回值問(wèn)題。
ps:在Linux下面編程要多看看它的函數(shù):
這其中就包括了Linux下面常用的c函數(shù), 你可以去看看
linux課程設(shè)計(jì)聊天qt
1. 求一份linux環(huán)境下的qt creator教程,更好是包含有關(guān)C編程的~~~謝了!
Qt creator是跨平臺(tái)的,你可以在Windows下編程,編譯的時(shí)候再拿到linux下重新編譯一下就OK了,Qt和C++語(yǔ)言類(lèi)版似,而且權(quán)Qt有自己的幫助文檔,多看看多試試,網(wǎng)上QT的視頻,看完了跟著做一下,或者你字節(jié)上網(wǎng)搜事件隊(duì)列處理,事件響應(yīng),信號(hào)和槽,這3樣都會(huì)了,做啥你都有思路了~
希望對(duì)你有所幫助!
2. 您好!向您請(qǐng)教一個(gè)問(wèn)題linux下桐碰QT界面,程序1如何獲取程序2的窗口句柄
linux Qt 下不流行句柄哪輪老. Qt 下要訪問(wèn)一個(gè)窗口用的是指針.
程序1 想獲取, 程序 2 的窗口句柄屬于進(jìn)程間專(zhuān)通屬信.
進(jìn)程間通信有多種方法.如果找同一臺(tái)機(jī)器上我推薦用有名管道. 但是由于每個(gè)進(jìn)程都有自己的地址空間.進(jìn)程間不能直李升接訪問(wèn)對(duì)方的地址.所有說(shuō)不管你有沒(méi)有成功獲得這個(gè)句柄,這個(gè)句柄都是不能用的..
3. Qt用windows下的工具開(kāi)發(fā)的界面能否放在linux下面使用如果能,這和linux下有什么區(qū)別
只調(diào)用QT庫(kù)或是標(biāo)準(zhǔn)庫(kù)的話,只要重新編譯就行,linux下有專(zhuān)用的Qt Creator,用法和WINDOWS類(lèi)似
4. linux下QT編程,就是寫(xiě)一個(gè)可視界面程序,輸入局域網(wǎng)內(nèi)某人IP,就可以和他聊天
這個(gè)程序很簡(jiǎn)單啊 要用到QUdpSocket等類(lèi)
5. 如何用qt在linux中編寫(xiě)并使用動(dòng)態(tài)鏈接庫(kù)
先寫(xiě)好實(shí)現(xiàn)動(dòng)態(tài)鏈接庫(kù)的libmy.cpp文件和libmy.h文件,如下:
// libmy.cpp
#include”libmy.h”
#include
using namespace std;
MyLib::MyLib()
{
}
MyLib::~MyLib()
{
}
void MyLib::hello()
{
cout setupUi(this);
QPixmap pixmap(“:/img/background.bmp”);
QPalette palette;
palette.setBrush(backgroundRole(), QBrush(pixmap));
setPalette(palette);
}
此外也可實(shí)現(xiàn)繼承自父類(lèi)QMainWindow的虛函數(shù)paintEvent,并在該函數(shù)中加入同樣代碼。
關(guān)于linux基于udp的聊天程序代碼的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技公司主營(yíng):網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、小程序制作、成都軟件開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)等業(yè)務(wù),是專(zhuān)業(yè)的成都做小程序公司、成都網(wǎng)站建設(shè)公司、成都做網(wǎng)站的公司。創(chuàng)新互聯(lián)公司集小程序制作創(chuàng)意,網(wǎng)站制作策劃,畫(huà)冊(cè)、網(wǎng)頁(yè)、VI設(shè)計(jì),網(wǎng)站、軟件、微信、小程序開(kāi)發(fā)于一體。
分享標(biāo)題:「實(shí)現(xiàn)UDP聊天,附Linux代碼」(linux基于udp的聊天程序代碼)
文章起源:http://www.dlmjj.cn/article/djsoioj.html


咨詢(xún)
建站咨詢(xún)
