Linux网络编程-UDP实现QQ聊天功能

目录

一、什么是UDP

二、UDP单播

三、UDP实现QQ聊天功能

3.1 代码实现

3.2  编译

3.3  效果

 四、总结


一、什么是UDP

        UDP协议详解可以查看博主其他博客,更有助于后面的开发实现。Linux网络编程-UDP协议详解_ProYuan的博客-CSDN博客一、UDP的概述UDP(User Datagram Protocol,用户数据报协议)是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。UDP提供不可靠服务,具有TCP所没有的优势:UDP无连接,时间上不存在建立连接需要的时延。空间上,TCP需要在端系统中维护连接状态,需要一定的开销。此连接装入包括接收和发送缓存,拥塞控制参数和序号与确认号的参数。UCP不维护连接状态,也不跟踪这些参数,开销小。空间和时间上都具有优势。举个例子:DNS如果运行在TCPhttps://blog.csdn.net/u012478275/article/details/121614965?spm=1001.2014.3001.5501

二、UDP单播

        本博客是使用UDP单播实现QQ聊天功能,更多有关UDP单播介绍和和实现,可以查看博主文章:

Linux网络编程-UDP单播服务客户端代码实现_ProYuan的博客-CSDN博客一、UDP单播介绍1.UDP介绍 UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。更多UDP详细介绍可以查看:Linux网络编程-UDP协议详解2.单播简介主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要...https://blog.csdn.net/u012478275/article/details/121626964?spm=1001.2014.3001.5501

三、UDP实现QQ聊天功能

3.1 代码实现

由于是聊天,肯定需要两个程序收发数据来实现QQ聊天。

   1. 第一个应用代码实现

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>

/************************************************************************
函数名称:	void *Recv_Thread(void* arg)
函数功能:	线程函数,负责接收对方的信息,并打印
函数参数:	arg套接字
函数返回:	无
************************************************************************/
void *Recv_Thread(void* arg)
{
	int sockfd = (int)arg;
	struct sockaddr_in recvaddr;
    socklen_t recvaddrlen = sizeof(recvaddr);
	while(1)
	{
		char recv_buf[200]  = "";
		recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&recvaddr, &recvaddrlen);
		printf("\r\033[31mUdpQQ1 Recv:%s\n",recv_buf);
		printf("\r\033[32mUdpQQ1 Send:");
		fflush(stdout);
	}
	return NULL;
}

/************************************************************************
函数名称:	int main(int argc, char *argv[])
函数功能:	主函数,用线程实现聊天
函数参数:	无
函数返回:	无
************************************************************************/
int main(int argc, char *argv[])
{
	struct sockaddr_in my_addr; 
	struct sockaddr_in dest_addr;
	
	//对套接字地址进行初始化
	bzero(&my_addr, sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port   = htons(8001);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	bzero(&dest_addr, sizeof(dest_addr));	
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_port   = htons(8000);

	//创建套接口
	int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if( sockfd < 0)
	{
		perror("socket error");
		exit(-1);
	}
	
	//设置端口
	int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
	if( err_log < 0)
	{
		perror("bind");
		close(sockfd);		
		exit(-1);
	}
	
	printf("Welcome ProYuan28 UDP QQ!!!\n");
	//创建接收线程
	pthread_t tid;
	pthread_create(&tid, NULL, Recv_Thread, (void*)sockfd); //创建线程
	
	
	//主进程负责发送消息
	while(1)
	{	
		printf("\r\033[32mUdpQQ1 Send:");
		char send_buf[512] = "";
		fgets(send_buf, sizeof(send_buf), stdin); //等待输入
		send_buf[strlen(send_buf) - 1] = '\0';    //确保输入的最后一位是'\0'
		if(strncmp(send_buf, "exit", 4) == 0)
		{
			close(sockfd);
			exit(0);
		}
		sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
	}
	return 0;
}

   2. 第二个应用

        其他和上面一样,修改收发端口就行。

	bzero(&my_addr, sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port   = htons(8000);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	bzero(&dest_addr, sizeof(dest_addr));	
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_port   = htons(8001);

3.2  编译

gcc  qq_udp.c  -o qq_udp  -lpthread

3.3  效果

       

 四、总结

一个简单QQ聊天就实现了,整个流程还是比较简单的,也是学习UDP通讯很经典的例子,更多Linux网络编程的学习,可以关注博主专栏,持续更新中,如有疑问,评论区留言或私信。


版权声明:本文为u012478275原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。