参考学习:
// server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
服务端:建立socket,申明自身port和IP,并绑定到socket,使用listen监听,
然后不断用accept查看是否有连接。如果有,捕获socket,并通过recv获取消息内容,
通信完成后调用closeSocket关闭accept捕获到的socket。如果不需要等待任何客户端连接,
直接用closeSocket关闭自身的socket。
*/
#include "pch.h"
#include <iostream>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib") //扩展,把ws2_32.lib 这个库加入到工程文件中
void initialization();
int main(){
//定义长度变量
int send_len = 0;
int recv_len = 0;
int len = 0;
//定义发送缓冲区和接受缓冲区
char send_buf[100];
char recv_buf[100];
//定义服务端套接字,接受请求套接字
SOCKET s_server;
SOCKET s_accept;
//服务端地址 客户端地址
SOCKADDR_IN server_addr;
SOCKADDR_IN accept_addr;
initialization();
//填充服务端地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl()将主机数转换成无符号长整形的网络字节顺序
server_addr.sin_port = htons(5010); //htons()将整型变量从主机字节顺序转变成网络字节顺序
//创建套接字 socket(地址类型,套接字类型,传输协议)
s_server = socket(AF_INET, SOCK_STREAM, 0);
//绑定套接字到一个IP地址和一个端口上(bind())
if (bind(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
std::cout << "套接字绑定失败!" << std::endl;
closesocket(s_server);
WSACleanup();
return 0;
}
else {
std::cout << "套接字绑定成功!" << std::endl;
}
//将套接字设置为监听模式等待连接请求(listen())
if (listen(s_server, SOMAXCONN) < 0) {
std::cout << "设置监听状态失败!" << std::endl;
closesocket(s_server);
WSACleanup(); //解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}
else {
std::cout << "设置监听状态成功!" << std::endl;
}
std::cout << "服务端正在监听中......" << std::endl;
while (true) {
//请求到来后接受连接请求,返回一个新的对应于此次连接的套接字(accept())
len = sizeof(SOCKADDR);
s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);
if (s_accept == SOCKET_ERROR) {
std::cout << "连接失败!" << std::endl;
closesocket(s_server);
closesocket(s_accept);
WSACleanup();
return 0;
}
std::cout << "建立连接!准备接受数据。" << std::endl;
//用返回的套接字和客户端进行通信(send()/recv())
while (true) {
recv_len = recv(s_accept, recv_buf, 100, 0);
if (recv_len < 0) {
std::cout << "接受失败!" << std::endl;
break;
}
else {
std::cout << "客户端信息:" << recv_buf << std::endl;
}
if (strcmp(recv_buf, "bye") == 0) { //断开通信
std::cout << "本次通信结束!" << std::endl;
std::cout << "服务端正在监听中......" << std::endl;
break;
}
std::cout << "请输入回复信息:";
std::cin >> send_buf;
send_len = send(s_accept, send_buf, 100, 0);
if (send_len < 0) {
std::cout << "发送失败!" << std::endl;
break;
}
//返回等待另一个连接请求
}
}
//关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())
closesocket(s_server);
closesocket(s_accept);
WSACleanup();
return 0;
}
void initialization() {
//初始化套接字库
WORD w_req = MAKEWORD(2, 2); //版本号2.2
WSADATA wsadata;
int err;
err = WSAStartup(w_req, &wsadata); //和相应的socket库绑定
if (err != 0) {
std::cout << "初始化套接字库失败!" << std::endl;
}
else {
std::cout << "初始化套接字库正确!" << std::endl;
}
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
std::cout << "套接字库版本号不符!" << std::endl;
WSACleanup();
}
else {
std::cout << "套接字库版本号正确!" << std::endl;
}
//填充服务端地址信息
}
// client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
客户端:建立socket,通过端口号和地址确定目标服务器,使用connect连接到服务器,
send发送消息,等待处理,通信完成后调用closeSocket关闭socket。
*/
#include "pch.h"
#include <iostream>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib") //扩展,把ws2_32.lib 这个库加入到工程文件中
void initialization();
int main() {
//定义长度变量
int send_len = 0;
int recv_len = 0;
//定义发送缓冲区和接受缓冲区
char send_buf[100];
char recv_buf[100];
//定义服务端套接字,接受请求套接字
SOCKET s_server;
//服务端地址
SOCKADDR_IN server_addr;
initialization();
//填充服务端地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(5010);
//创建套接字 socket(地址类型,套接字类型,传输协议)
s_server = socket(AF_INET, SOCK_STREAM, 0);
//向服务器发出连接请求(connect())
if (connect(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
std::cout << "服务器连接失败!" << std::endl;
closesocket(s_server);
WSACleanup();
return 0;
}
else {
std::cout << "服务器连接成功!" << std::endl;
}
//和服务区进行通信(send()/recv())
while (true) {
std::cout << "请输入发送信息:";
std::cin >> send_buf;
send_len = send(s_server, send_buf, 100, 0);
if (send_len < 0) {
std::cout << "发送失败!" << std::endl;
break;
}
if (strcmp(send_buf, "bye") == 0) { //输入bye就断开通信
std::cout << "本次通信结束!" << std::endl;
break;
}
recv_len = recv(s_server, recv_buf, 100, 0);
if (recv_len < 0) {
std::cout << "接受失败!" << std::endl;
break;
}
else {
std::cout << "服务器端信息:" << recv_buf << std::endl;
}
}
//关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())
closesocket(s_server);
WSACleanup();
return 0;
}
void initialization() {
//初始化套接字库
WORD w_req = MAKEWORD(2, 2); //版本号2.2
WSADATA wsadata;
int err;
err = WSAStartup(w_req, &wsadata); //和相应的socket库绑定
if (err != 0) {
std::cout << "初始化套接字库失败!" << std::endl;
}
else {
std::cout << "初始化套接字库正确!" << std::endl;
}
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
std::cout << "套接字库版本号不符!" << std::endl;
WSACleanup();
}
else {
std::cout << "套接字库版本号正确!" << std::endl;
}
//填充服务端地址信息
}
// server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
服务端:建立socket,申明自身port和IP,并绑定到socket,使用listen监听,
然后不断用accept查看是否有连接。如果有,捕获socket,并通过recv获取消息内容,
通信完成后调用closeSocket关闭accept捕获到的socket。如果不需要等待任何客户端连接,
直接用closeSocket关闭自身的socket。
*/
#include "pch.h"
#include <iostream>
#include <winsock.h>
#include <thread>
#include <mutex>
#pragma comment(lib,"ws2_32.lib") //扩展,把ws2_32.lib 这个库加入到工程文件中
void initialization();
std::mutex m;
void severThread(SOCKET s_accept) {
//初始化一个没有加锁的mutex,手动加锁
std::unique_lock<std::mutex> g(m, std::defer_lock);
bool isNamed = false;
char client_name[100];
int send_len = 0;
int recv_len = 0;
char send_buf[100];
char recv_buf[100];
while (true) {
recv_len = recv(s_accept, recv_buf, 100, 0);
if (recv_len < 0) {
std::cout << "接受失败!与客户端用户(" << client_name << " )断开连接。" << std::endl << std::endl;
std::cout << "服务端正在监听中......" << std::endl;
break;
}
else {
g.lock(); //m被g接管,如果接收到客户端发送的信息,给g加锁
if (!isNamed) {
memcpy(client_name, recv_buf, strlen(recv_buf)); //拷贝用户名
client_name[strlen(recv_buf)] = '\0';
std::cout << "客户端用户(" << client_name << " )已登录。" << std::endl;
}
else {
std::cout << "客户端用户(" << client_name << " ):" << recv_buf << std::endl;
}
}
if (!isNamed) {
isNamed = true;
}
else {
if (strcmp(recv_buf, "bye") == 0) { //断开通信
std::cout << "本次通信结束!" << std::endl << std::endl;
std::cout << "服务端正在监听中......" << std::endl;
break;
}
std::cout << "请输入回复信息:";
std::cin >> send_buf;
send_len = send(s_accept, send_buf, 100, 0);
if (send_len < 0) {
std::cout << "发送失败!与客户端用户(" << client_name << " )断开连接。" << std::endl << std::endl;
std::cout << "服务端正在监听中......" << std::endl;
break;
}
}
g.unlock(); //解锁
}
closesocket(s_accept);
}
int main(){
//定义长度变量
int send_len = 0;
int recv_len = 0;
int len = 0;
//定义服务端套接字,接受请求套接字
SOCKET s_server;
SOCKET s_accept;
//服务端地址 客户端地址
SOCKADDR_IN server_addr;
SOCKADDR_IN accept_addr;
initialization();
//填充服务端地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl()将主机数转换成无符号长整形的网络字节顺序
server_addr.sin_port = htons(5010); //htons()将整型变量从主机字节顺序转变成网络字节顺序
//创建套接字 socket(地址类型,套接字类型,传输协议)
s_server = socket(AF_INET, SOCK_STREAM, 0);
//绑定套接字到一个IP地址和一个端口上(bind())
if (bind(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
std::cout << "套接字绑定失败!" << std::endl;
closesocket(s_server);
WSACleanup();
return 0;
}
else {
std::cout << "套接字绑定成功!" << std::endl;
}
//将套接字设置为监听模式等待连接请求(listen())
if (listen(s_server, SOMAXCONN) < 0) {
std::cout << "设置监听状态失败!" << std::endl;
closesocket(s_server);
WSACleanup(); //解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}
else {
std::cout << "设置监听状态成功!" << std::endl;
}
std::cout << "服务端正在监听中......" << std::endl;
while (true) {
//请求到来后接受连接请求,返回一个新的对应于此次连接的套接字(accept())
len = sizeof(SOCKADDR);
s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);
if (s_accept == SOCKET_ERROR) {
std::cout << "连接失败!" << std::endl;
closesocket(s_server);
closesocket(s_accept);
WSACleanup();
return 0;
}
std::cout << "已与新客户端建立连接!等待新用户输入用户名......" << std::endl;
std::thread t(severThread, s_accept);
t.detach();
}
//关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())
closesocket(s_server);
closesocket(s_accept);
WSACleanup();
return 0;
}
void initialization() {
//初始化套接字库
WORD w_req = MAKEWORD(2, 2); //版本号2.2
WSADATA wsadata;
int err;
err = WSAStartup(w_req, &wsadata); //和相应的socket库绑定
if (err != 0) {
std::cout << "初始化套接字库失败!" << std::endl;
}
else {
std::cout << "初始化套接字库正确!" << std::endl;
}
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
std::cout << "套接字库版本号不符!" << std::endl;
WSACleanup();
}
else {
std::cout << "套接字库版本号正确!" << std::endl;
}
//填充服务端地址信息
}
// client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
客户端:建立socket,通过端口号和地址确定目标服务器,使用connect连接到服务器,
send发送消息,等待处理,通信完成后调用closeSocket关闭socket。
*/
#include "pch.h"
#include <iostream>
#include <winsock.h>
#include <thread>
#include <mutex>
#pragma comment(lib,"ws2_32.lib") //扩展,把ws2_32.lib 这个库加入到工程文件中
void initialization();
int main() {
//定义长度变量
int send_len = 0;
int recv_len = 0;
//定义发送缓冲区和接受缓冲区
char send_buf[100];
char recv_buf[100];
//定义服务端套接字,接受请求套接字
SOCKET s_server;
//服务端地址
SOCKADDR_IN server_addr;
//是否输入名字
bool isNamed = false;
initialization();
//填充服务端地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(5010);
//创建套接字 socket(地址类型,套接字类型,传输协议)
s_server = socket(AF_INET, SOCK_STREAM, 0);
//向服务器发出连接请求(connect())
if (connect(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
std::cout << "服务器连接失败!" << std::endl;
closesocket(s_server);
WSACleanup();
return 0;
}
else {
std::cout << "服务器连接成功!" << std::endl;
}
//和服务区进行通信(send()/recv())
while (true) {
if (!isNamed) {
std::cout << "请输入用户名:";
std::cin >> send_buf;
send_len = send(s_server, send_buf, 100, 0);
if (send_len < 0) {
std::cout << "发送失败!" << std::endl;
break;
}
else {
std::cout << "用户名注册成功!" << std::endl;
isNamed = true;
}
}
std::cout << "请输入发送信息:";
std::cin >> send_buf;
send_len = send(s_server, send_buf, 100, 0);
if (send_len < 0) {
std::cout << "发送失败!" << std::endl;
break;
}
if (strcmp(send_buf, "bye") == 0) { //输入bye就断开通信
std::cout << "本次通信结束!" << std::endl;
break;
}
recv_len = recv(s_server, recv_buf, 100, 0);
if (recv_len < 0) {
std::cout << "接受失败!" << std::endl;
break;
}
else {
std::cout << "服务器端信息:" << recv_buf << std::endl;
}
}
//关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())
closesocket(s_server);
WSACleanup();
return 0;
}
void initialization() {
//初始化套接字库
WORD w_req = MAKEWORD(2, 2); //版本号2.2
WSADATA wsadata;
int err;
err = WSAStartup(w_req, &wsadata); //和相应的socket库绑定
if (err != 0) {
std::cout << "初始化套接字库失败!" << std::endl;
}
else {
std::cout << "初始化套接字库正确!" << std::endl;
}
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
std::cout << "套接字库版本号不符!" << std::endl;
WSACleanup();
}
else {
std::cout << "套接字库版本号正确!" << std::endl;
}
//填充服务端地址信息
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务