c++语言socket udp聊天程序,C++基于UDP的命令行聊天工具代码

本文来自孙鑫老师的VC++视频中的内容。

知识点:

基于UDP(面向无连接)的socket编程

1)服务器端(接收端)程序

(1)       创建套接字(socket)

(2)       将套接字绑定到一个本地地址和端口上(bind)

(3)       等待接收数据(recvfrom)

(4)       关闭套接字

2)客户端程序

(1)       创建套接字(socket)

(2)       向服务器发送数据(sendto)

(3)       关闭套接字

服务器端代码:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

return;

}

if ( LOBYTE( wsaData.wVersion ) != 2 ||

HIBYTE( wsaData.wVersion ) != 2 ) {

WSACleanup( );

return;

}

SOCKET sockSrv=socket(AF_INET, SOCK_DGRAM, 0); //创建服务器端socket

SOCKADDR_IN addrSrv; //定义服务器端信息结构体

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //将socket与本地地址和端口绑定

char sendBuf[100];

char recvBuf[100];

char tempBuf[200];

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

while(1)

{

recvfrom(sockSrv, recvBuf,100,0,(SOCKADDR*)&addrClient, &len); //接收来自客户端的信息,并使用接收到的信息填充addrClient结构体

if('q'==recvBuf[0])

{

sendto(sockSrv, "Char end!", strlen("Char end!")+1,0,(SOCKADDR*)&addrClient, len);

printf("Chat end\n");

break;

}

sprintf(tempBuf,"%s say: %s", inet_ntoa(addrClient.sin_addr), recvBuf);

printf("%s\n",tempBuf);

printf("Please input data:\n");

gets(sendBuf);

sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient, len);

}

closesocket(sockSrv);

WSACleanup();

}

客户端代码:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

return;

}

if ( LOBYTE( wsaData.wVersion ) != 2 ||

HIBYTE( wsaData.wVersion ) != 2 ) {

WSACleanup( );

return;

}

SOCKET sockClient=socket(AF_INET, SOCK_DGRAM, 0); //AF_INET是windows socket默认的地址族

SOCKADDR_IN addrSrv; //保存远程服务器相关信息的结构体

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //将IP转换为网络字节序列

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000); //设置端口

char sendBuf[100];

char recvBuf[100];

char tempBuf[200];

int len=sizeof(SOCKADDR);

while(1)

{

printf("Please input data:\n");

gets(sendBuf); //获取输入流信息

sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv, len); //使用本地socket向远程主机发送信息

recvfrom(sockClient, recvBuf,100,0,(SOCKADDR*)&addrSrv, &len); //使用本地socket接收来自远程主机的信息

if('q'==recvBuf[0])

{

sendto(sockClient, "Char end!", strlen("Char end!")+1,0,(SOCKADDR*)&addrSrv, len);

printf("Chat end\n");

break;

}

sprintf(tempBuf,"%s say: %s", inet_ntoa(addrSrv.sin_addr), recvBuf);

printf("%s\n",tempBuf);

}

closesocket(sockClient);

WSACleanup();

}

先启动服务端,再启动客户端。启动后,客户端先开始讲话,而后双方就可以一问一答的进行聊天了。只要双方中有任何一方输入字母q,双方即可同时退出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值