UDP实现点对点聊天(多线程)-C语言

UDP实现点对点聊天(多线程)-服务器端

//**********操作步骤********************//
//1、编译:gcc UDPM.c -lws2_32 -lmycon -lwinmm -o UDPM.exe
//2、运行:UDPM
#include <stdio.h>
#include <winsock2.h>
#include <mycon.h>
int isrunning = 1;
struct sockaddr_in clientaddr;
int naddrlen = sizeof(clientaddr);
char recvData[256];
char sendData[256];
SOCKET serversocket;
void receive_msg();

int main(int argc, char *argv[])
{

	set_title("基于UDP的简单的聊天程序服务器端");
	set_size(80, 25);
	cls();
	printf("Bing室欢迎你!!");
	//设定socket版本为2.2
	WORD sockVersion = MAKEWORD(2, 2);
	//初始化动态链接库ws2_32.dll
	WSADATA wsaData;
	if(WSAStartup(sockVersion, &wsaData) != 0)
	{
		return 0;
	}
	//创建socket套接字,指定使用UDP协议
	serversocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if(serversocket == INVALID_SOCKET)
	{
		printf("socket创建错误!");
		return 0;
	}
	//填充相关地址信息,绑定ip地址、协议及端口
	struct sockaddr_in serveraddr;
	//使用TCP/IP协议栈
	serveraddr.sin_family = AF_INET;
	//将端口8888转换为网络字节序
	serveraddr.sin_port = htons(6666);
	//绑定本机的IP地址,可以使用本机的任何IP地址
	serveraddr.sin_addr.S_un.S_addr = INADDR_ANY;
	//绑定socket套接字与地址
	if(bind(serversocket, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == SOCKET_ERROR)
	{
		printf("绑定地址错误!");
		closesocket(serversocket);
		return 0;
	}
	
	//启用接收消息线程
	_beginthread(receive_msg, 0, NULL);
	//配置已经完成  下面自由操作===这一个没有将接收分离出去  因此不能自主发送 实时通信
	while(1)
	{
		if(!isrunning)
		{
			break;
		}
		gets(sendData);
		sendData[strlen(sendData)] = '\n';
		//发送
		sendto(serversocket, sendData, strlen(sendData), 0, (struct sockaddr*)&clientaddr, naddrlen);
		if(!strcmp(recvData, "bye"))
		{
			isrunning = 0;
			printf("系统退出!");
			break;
		}
		memset(sendData, 0, sizeof(sendData));
	}
	//结束接收消息的线程
	_endthread();
	//关闭套接字
	closesocket(serversocket);
	//释放WinSock动态链接库相关的资源
	WSACleanup();
	return 0;
}

void receive_msg()
{
	while(1)
	{
		//接收UDP的数据包  接收存到recvData 长度返回ret 客户端相关信息给clientaddr
		int ret = recvfrom(serversocket, recvData, 256, 0, (struct sockaddr*)&clientaddr, &naddrlen);
		if(ret > 0)
		{
			recvData[ret] = '\0';   //结束字符串
			printf("客户端%s发来的信息:%s\n", inet_ntoa(clientaddr.sin_addr), recvData);
			if(!strcmp(recvData, "bye"))
			{
				isrunning = 0;
				printf("系统退出!");
				return ;
			}
		}
		memset(recvData, 0, sizeof(recvData));
	}
}

UDP实现点对点聊天(多线程)-客户端

//**********操作步骤********************//
//1、编译:gcc UDPC.c -lws2_32 -lmycon -lwinmm -o UDPC.exe
//2、运行:UDPC
#include <stdio.h>
#include <winsock2.h>
#include <mycon.h>
SOCKET clientsocket;
struct sockaddr_in serveraddr;
int len = sizeof(serveraddr);
char sendData[20];
void receive_msg();
char recvData[256];
int isrunning = 1;
int main(int argc, char *argv[])
{

	set_title("基于UDP的简单的聊天程序客户端");
	set_size(80, 25);
	cls();
	printf("Bing室欢迎你!!");
	//设定socket版本为2.2
	WORD sockVersion = MAKEWORD(2, 2);
	//初始化动态链接库ws2_32.dll
	WSADATA wsaData;
	if(WSAStartup(sockVersion, &wsaData))
	{
		return 0;
	}
	//创建socket套接字,指定使用UDP协议
	clientsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if(clientsocket == INVALID_SOCKET)
	{
		printf("socket创建错误!");
		return 0;
	}
	//填充相关地址信息,绑定ip地址、协议及端口
	
	//使用TCP/IP协议栈
	serveraddr.sin_family = AF_INET;
	//将端口8888转换为网络字节序
	serveraddr.sin_port = htons(6666);
	//绑定本机的IP地址,可以使用本机的任何IP地址
	serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    //启用接收消息线程
	_beginthread(receive_msg, 0, NULL);
    while(1)
    {
    	if(!isrunning)
		{
			break;
		}
		gets(sendData);
		sendData[strlen(sendData)] = '\n';
		sendto(clientsocket, sendData, strlen(sendData), 0, (struct sockaddr*)&serveraddr, len);
		if(!strcmp(recvData, "bye"))
		{
			isrunning = 0;
			printf("系统退出!");
			break;
		}
		memset(sendData, 0, sizeof(sendData));
	}

	//结束接收消息的线程
	_endthread();
	//关闭套接字
	closesocket(clientsocket);
	//释放WinSock动态链接库相关的资源
	WSACleanup();
	return 0;

}
void receive_msg()
{
	while(1)
	{
		//接收UDP的数据包  接收存到recvData 长度返回ret 客户端相关信息给clientaddr
		int ret = recvfrom(clientsocket, recvData, 256, 0, (struct sockaddr*)&serveraddr, &len);
		if(ret > 0)
		{
			recvData[ret] = '\0';   //结束字符串
			printf("客户端%s发来的信息:%s\n", inet_ntoa(serveraddr.sin_addr), recvData);
			if(!strcmp(recvData, "bye"))
			{
				isrunning = 0;
				printf("系统退出!");
				return ;
			}
		}
		memset(recvData, 0, sizeof(recvData));
	}
}

此源码需要安装mycon库,具体安装步骤见DEV有声有色控制台文本mycon库的下载和安装步骤。如果未安装有色控制台文本mycon库,可以将mycon部分进行注释。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脆订壳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值