永发信息网

怎么用C++编写一个基于UDP的简单聊天程序?

答案:1  悬赏:20  手机版
解决时间 2021-03-01 08:20
怎么用C++编写一个基于UDP的简单聊天程序?
最佳答案
首先声明下,下面的答案是从博客上粘过来了,因为以前自己写的时候也参考这个写的。
基于UDP的聊天程序服务器端源程序:

#include "winsock2.h"
#include "stdio.h"

void main()
{
//加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORd( 1, 1 ); //版本号为1.1

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}

//创建套接字
//注意第二个参数和TCP设置不同
SOCKET sockServer=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrServer; //设置服务器端套接字的地址结构的相关属性
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //设置IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //设置端口号

//将套接字和服务器地址结构绑定
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
char tempBuf[100];
char sendBuf[100];

while(1)
{
//从客户端接收数据
int result=recvfrom(sockServer,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if(result==SOCKET_ERROR)
{
int errCode=WSAGetLastError();
printf("error:%d",errCode);
break; //退出循环
}
else
{
if(recvBuf[0]=='q') //对方请求退出
{
//同样将退出请求发送回去
sendto(sockServer,"q",strlen("q")+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR));
printf("the chat end!");
break;
}
else
{
//将对方发送过来的信息前段加上IP地址进行输出
sprintf(tempBuf,"%s said:%s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);

//将用户的键盘输入发送到对方
printf("pleas input the message:\n");
gets(sendBuf); //得到键盘输入内容 sendto(sockServer,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR));
}
}
}

closesocket(sockServer);
WSACleanup();
}

基于UDP的聊天程序客户端端源程序:
#include "winsock2.h"
#include "stdio.h"

void main()
{
//加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORd( 1, 1 ); //版本号为1.1

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}

//创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); //注意第二个参数和TCP设置不同

SOCKADDR_IN addrServer; //服务器地址结构
addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //服务器地址
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //服务器端口号

char tempBuf[100];
char recvBuf[100];
char sendBuf[100];

int len=sizeof(SOCKADDR);

while(1)
{
printf("plese input the message:\n");
gets(sendBuf); //得到用户的键盘输入
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));

int result=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrServer,&len);
if(result==SOCKET_ERROR)
{
int errCode=WSAGetLastError();
printf("error:%d",errCode);
break; //退出循环
}
else
{
if(recvBuf[0]=='q') //对方请求退出
{
//同样将退出请求发送回去
sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
printf("the chat end!");
break;
}
else
{
//将对方发送过来的信息前段加上IP地址进行输出
sprintf(tempBuf,"%s said:%s",inet_ntoa(addrServer.sin_addr),recvBuf);
printf("%s\n",tempBuf);
}
}

}

closesocket(sockClient);
WSACleanup();
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
经常喝豆浆的好处和坏处是什么?
房县人民医院北街门诊部地址有知道的么?有点
小溪是什么意思
【我生活在 之中 作文】《我生活在。。。之中
芝英乐华金属材料经营部地址有知道的么?有点
蛋糕展示柜多少钱??
想面试房地产公司工程部,希望有经验人士给些
校区内室外的污水管,消防水管,给水管是属于市
最近有一款软件挺火的,叫什么公证云,好像是
16周胎龄hcg32.29ng/ml,正常吗
经开区梁尤光西医内科诊所地址有知道的么?有
上海金驹融资担保有限公司地址有知道的么?有
苏记奶酪地址在哪,我要去那里办事
Intel 酷睿i7 5750HQ和AMD FX-9830P有什么区
不想谈恋爱,我都27了还是不想谈恋爱?我正常
推荐资讯
【田园生活】形容田园生活的成语有多少归隐田
在法律上证明人处在什么位置
和泓·东28地址有知道的么?有点事想过去
该企业购入原材料的入账价值为()元。A.1000
列式计算怎么列算式?
火焰限界的配置要求
贵洲省贵烟有几种品牌每种品牌价格是多少
国华汽车这个地址在什么地方,我要处理点事
家中跑去野兔被打死暗示着什么?
人中不长胡子怎么刺激
已知函数y=f(x)是周期为2的周期函数,且当x
qq快捷方式的聊天记录 在删除好友后还能查看
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?