通过C++实现基于socket的TCP聊天服务器
什么是socket
socket是一套用于不同主机间的API。
IP地址用于唯一标识网络设备;端口用于区分主机上的不同应用(进程);
通过socket可以在不同主机不同应用之间建立一条虚拟通道;(点对点,应用对应用);
socket有两种类型,TCP(一对一数据流,不会丢包)和UDP(广播式);
服务器Server.cpp
1.创建一个socket, AF_INET表示使用的是IPV4地址,SOCK_STREAM表示使用的是TCP协议
SOCKET serverSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);2.bind函数表示的是将我们的socket关联到我们的主机的网卡和端口上
bind(serverSock,(sockaddr*)&serverAddr,sizeof(serverAddr));3.listen函数将我们的socket设置为监听状态,等待客户端的连接
listen(serverSock,5);4.接受任意客户端的连接,并返回一个新的socket和IP地址
sockaddr_in clientAddr;intaddrLen=sizeof(clientAddr);SOCKET clientSock=accept(serverSock,(sockaddr*)&clientAddr,&addrLen);5.配置客户端功能
charrecvBuf[BUF_SIZE];while(true){// 接收客户端消息ZeroMemory(recvBuf,BUF_SIZE);intret=recv(clientSock,recvBuf,BUF_SIZE,0);if(ret<=0){cout<<"客户端断开连接"<<endl;break;}cout<<"客户端:"<<recvBuf<<endl;// 服务器回复消息string sendMsg;cout<<"输入回复:";getline(cin,sendMsg);send(clientSock,sendMsg.c_str(),sendMsg.length(),0);}客户端Client.cpp
1.同样创建一个socket
SOCKET clientSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);2.配置好服务器的IP地址和端口号
sockaddr_in serverAddr{};serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(PORT);serverAddr.sin_addr.S_un.S_addr=inet_addr(SERVER_IP);3.连接服务器
connect(clientSock,(sockaddr*)&serverAddr,sizeof(serverAddr));cout<<"已连接聊天服务器!"<<endl;4.配置客户端功能
charrecvBuf[BUF_SIZE];while(true){// 发送消息给服务器string sendMsg;cout<<"输入消息:";getline(cin,sendMsg);send(clientSock,sendMsg.c_str(),sendMsg.length(),0);// 接收服务器回复ZeroMemory(recvBuf,BUF_SIZE);recv(clientSock,recvBuf,BUF_SIZE,0);cout<<"服务器:"<<recvBuf<<endl;}