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部分进行注释。
833

被折叠的 条评论
为什么被折叠?



