目录
今天实现任务:实现三个层次的简单的网络通信
- 实现一个客户端与服务器相连接
- 实现多个客户端与服务器相连接
- 实现客户端与服务器之间进行多次的信息收发
一,实现一个客户端与服务器相连接
图解:
客户端代码:
#define WIN32_LEAN_AND_MEAN
#include<iostream>
#include<windows.h>
#include<Winsock2.h>
using namespace std;
int main()
{
//启动Windows socket 2.x环境
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
//---------------------------------
//1,用Socket API建立建立TCP客户端
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//2,连接服务器 connect
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int ret = connect(_sock, (sockaddr*)&_sin, sizeof(_sin));
if (SOCKET_ERROR == ret)
{
cout << "错误,建立Socket失败" << endl;
}
else
{
cout << "建立Socket成功" << endl;
}
//3,接受服务器消息
char recvBuf[128] = {};
int nlen = recv(_sock, recvBuf, 256, 0);
if (nlen > 0)
{
cout << "接收到数据" << recvBuf << endl;
}
//4,关闭套接字closesocket
closesocket(_sock);
//-----------------------------------
//清除Windows socket环境
WSACleanup();
system("pause");
return 0;
}
服务器端代码:
#define WIN32_LEAN_AND_MEAN
#include<iostream>
#include<windows.h>
#include<Winsock2.h>
using namespace std;
int main()
{
//启动Windows socket 2.x环境
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
//---------------------------------
//1,建立一个socket
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//2,bind 绑定用于接受客户端连接的网络接口
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin)))
{
cout << "错误,绑定网络端口失败" << endl;
}
else
{
cout << "绑定网络端口成功" << endl;
}
//3,listen 监听网络端口
if (SOCKET_ERROR == listen(_sock, 5))
{
cout << "错误,监听网络端口失败" << endl;
}
else
{
cout << "监听网络端口成功" << endl;
}
//4,accept 等待客户端连接
sockaddr_in clientAddr;
int nAddrlen = sizeof(clientAddr);
SOCKET _cSock = INVALID_SOCKET;
_cSock = accept(_sock, (sockaddr *)&clientAddr, &nAddrlen);
if (INVALID_SOCKET == _cSock)
{
cout << "错误,接受到无效的客户端连接" << endl;
}
cout << "新的客户端加入:" << inet_ntoa(clientAddr.sin_addr) << endl;
char msgBuf[] = "我是客户端";
//5,send 向客户端发送一条数据
send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
//6,关闭套接字closesocket
closesocket(_sock);
//-----------------------------------
//清除Windows socket环境
WSACleanup();
system("pause");
return 0;
}
二,实现多个客户端与服务器相连接
图解:
代码运行截图:
客户端代码不变;
服务器端代码:
#define WIN32_LEAN_AND_MEAN
#include<iostream>
#include<windows.h>
#include<Winsock2.h>
using namespace std;
int main()
{
//启动Windows socket 2.x环境
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
//---------------------------------
//1,建立一个socket
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//2,bind 绑定用于接受客户端连接的网络接口
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin)))
{
cout << "错误,绑定网络端口失败" << endl;
}
else
{
cout << "绑定网络端口成功" << endl;
}
//3,listen 监听网络端口
if (SOCKET_ERROR == listen(_sock, 5))
{
cout << "错误,监听网络端口失败" << endl;
}
else
{
cout << "监听网络端口成功" << endl;
}
//4,accept 等待客户端连接
sockaddr_in clientAddr;
int nAddrlen = sizeof(clientAddr);
//5,接受多个客户端的请求连接
while (1)
{
SOCKET _cSock = INVALID_SOCKET;
_cSock = accept(_sock, (sockaddr *)&clientAddr, &nAddrlen);
if (INVALID_SOCKET == _cSock)
{
cout << "错误,接受到无效的客户端连接" << endl;
}
cout << "新的客户端加入:" << inet_ntoa(clientAddr.sin_addr) << endl;
char msgBuf[] = "我是客户端";
//5,send 向客户端发送一条数据
send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
}
//6,关闭套接字closesocket
closesocket(_sock);
//-----------------------------------
//清除Windows socket环境
WSACleanup();
system("pause");
return 0;
}
三,实现客户端与服务器之间进行多次的信息收发
图解:
运行截图:
客户端代码:
#define WIN32_LEAN_AND_MEAN
#include<iostream>
#include<windows.h>
#include<Winsock2.h>
using namespace std;
int main()
{
//启动Windows socket 2.x环境
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
//---------------------------------
//1,用Socket API建立建立TCP客户端
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//2,连接服务器 connect
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int ret = connect(_sock, (sockaddr*)&_sin, sizeof(_sin));
if (SOCKET_ERROR == ret)
{
cout << "错误,建立Socket失败" << endl;
}
else
{
cout << "建立Socket成功" << endl;
}
while (true)
{
//3,输入请求
char cmdBuf[128] = {};
cin >> cmdBuf;
//4,处理请求
if (0 == strcmp(cmdBuf, "exit"))
{
break;
}
else
{
//5,向服务器发送请求
send(_sock, cmdBuf, strlen(cmdBuf) + 1, 0);
}
//6,接受服务器消息
char recvBuf[128] = {};
int nlen = recv(_sock, recvBuf, 256, 0);
if (nlen > 0)
{
cout << "接收到数据" << recvBuf << endl;
}
}
//7,关闭套接字closesocket
closesocket(_sock);
//-----------------------------------
//清除Windows socket环境
WSACleanup();
system("pause");
return 0;
}
服务器端代码:
#define WIN32_LEAN_AND_MEAN
#include<iostream>
#include<windows.h>
#include<Winsock2.h>
using namespace std;
int main()
{
//启动Windows socket 2.x环境
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
//---------------------------------
//1,建立一个socket
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//2,bind 绑定用于接受客户端连接的网络接口
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin)))
{
cout << "错误,绑定网络端口失败" << endl;
}
else
{
cout << "绑定网络端口成功" << endl;
}
//3,listen 监听网络端口
if (SOCKET_ERROR == listen(_sock, 5))
{
cout << "错误,监听网络端口失败" << endl;
}
else
{
cout << "监听网络端口成功" << endl;
}
//4,accept 等待客户端连接
sockaddr_in clientAddr;
int nAddrlen = sizeof(clientAddr);
SOCKET _cSock = INVALID_SOCKET;
_cSock = accept(_sock, (sockaddr *)&clientAddr, &nAddrlen);
if (INVALID_SOCKET == _cSock)
{
cout << "错误,接受到无效的客户端连接" << endl;
}
cout << "新的客户端加入:" << inet_ntoa(clientAddr.sin_addr) << endl;
char _recvBuf[128] = {};
while (true)
{
int nLen = recv(_cSock, _recvBuf, 128, 0);
//5,接受客户端的请求数据
if (nLen <= 0)
{
cout << "客户端已经退出,任务结束" << endl;
break;
}
//6,处理请求
if (0 == strcmp(_recvBuf, "getName"))
{
char msgBuf[] = "Xiao Qiang.";
//7,send 向客户端发送一条数据
send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
}
else if (0 == strcmp(_recvBuf, "getAge"))
{
char msgBuf[] = "80.";
//7,send 向客户端发送一条数据
send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
}
else
{
char msgBuf[] = "???";
//7,send 向客户端发送一条数据
send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
}
}
//6,关闭套接字closesocket
closesocket(_sock);
//-----------------------------------
//清除Windows socket环境
WSACleanup();
system("pause");
return 0;
}
下一篇正在路上: