server端代码:
#include <WinSock2.h>
#include <iostream>
using namespace std;
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);
//绑定
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));
//定义字符数组
char recvBuf[100];
char sendBuf[100];
//因为我们接收数据的时候,我们需要获取和我们通信的这一方的地址信息,通过调用recvfrom函数得到的,但是我们需要提供一个结构体的变量。
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
//收发数据
while(1)
{
//这是服务端,首先需要接收数据
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
/*当我们接收到数据的时候要进行一个判断,判断数据的第一个字符是不是q,
如果是q,表明和我们通讯的这一方他想要退出。既然他想要退出,我们也给她发一个q,让它结束。*/
if(recvBuf[0]=='q'){
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
cout<<"chat end !"<<endl;
break;
}
cout<<inet_ntoa(addrClient.sin_addr)<<"say: "<<recvBuf<<endl;
cout<<"please input the data :"<<endl;
cin>>sendBuf;
//发送数据
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);
}
closesocket(sockSrv);
WSACleanup();
}
//第一次没编译过去的原因是因为sendto函数中的参数写错了
client端代码:
#include<WinSock2.h>
#include<iostream>
using namespace std;
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);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
char recvBuf[100];
char sendBuf[100];
int len=sizeof(SOCKADDR);
while(1){
//作为客户端/发送端首先要发送数据
cout<<"please input the data: "<<endl;
cin>>sendBuf;
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
//接收数据
recvfrom(sockClient,recvBuf,strlen(recvBuf)+1,0,(SOCKADDR*)&addrSrv,&len);
if(recvBuf[0]=='q'){
sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);
cout<<"chat end!"<<endl;
break;
}
cout<<inet_ntoa(addrSrv.sin_addr)<<"say: "<<recvBuf<<endl;
}
closesocket(sockClient);
WSACleanup();
}
运行结果:
注意 因为输入用的是cin,所以遇到空格就停了,可以使用get()等函数输入遇到回车才结束输入。