本示例使用Win32控制台实现socket通信 ,可多个客户端同时连接服务器。

服务端代码:

#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
//1、初始化套接字库
WORD w_req = MAKEWORD(2, 2);//版本号
WSADATA wsadata;
int err = WSAStartup(w_req, &wsadata);//当调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
if (err != 0)
{
cout << "初始化套接字库失败!" << endl;
return 0;
}
else
{
cout << "初始化套接字库成功!" << endl;
}
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2)
{
cout << "套接字库版本号不符!" << endl;
WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}
else
{
cout << "套接字库版本正确!" << endl;
}
//设置服务端信息,设置IP和端口号
SOCKADDR_IN server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(1234);
//2、创建服务端套接字(socket)。
SOCKET s_server = socket(AF_INET, SOCK_STREAM, 0);
//3、绑定套接字
if (bind(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout << "套接字绑定失败!" << endl;
WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}
else
{
cout << "套接字绑定成功!" << endl;
}
//4、将套接字设为监听模式(listen)。
if (listen(s_server, SOMAXCONN) < 0)
{
cout << "设置监听状态失败!" << endl;
WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}
else
{
cout << "设置监听状态成功!" << endl;
}
while (1)
{
//5、等待连接请求到来,程序发生阻塞,当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
cout << "服务端正在监听连接..." << endl;
int len = sizeof(SOCKADDR);
SOCKADDR_IN accept_addr;
SOCKET s_accept = accept(s_server, (SOCKADDR *)&accept_addr, &len);
if (s_accept == SOCKET_ERROR)
{
cout << "连接失败!" << endl;
WSACleanup();
return 0;
}
cout << "连接建立,准备接受数据..." << endl;
//6、用返回的套接字和客户端进行通信(send/recv)。
char recv_buf[100];//定义接受缓冲区
int recv_len = recv(s_accept, recv_buf, 100, 0);//接受客户端信息
if (recv_len < 0)
{
cout << "接受失败!" << endl;
//关闭接收套接字
closesocket(s_accept);
break;
}
else
{
cout << "来自客户端信息:" << recv_buf << endl;
cout << "发回信息至客户端..." << endl;
int send_len = send(s_accept, recv_buf, 100, 0);
if (send_len < 0)
{
cout << "发回信息至客户端失败!" << endl;
//关闭接收套接字
closesocket(s_accept);
break;
}
}
//7、关闭接收套接字,等待下一个连接
closesocket(s_accept);
}
//8、关闭服务端套接字,释放资源
closesocket(s_server);
WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}

客户端代码:

#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
//1、初始化套接字库
WORD w_req = MAKEWORD(2, 2);//版本号
WSADATA wsadata;
int err;
err = WSAStartup(w_req, &wsadata);//当调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
if (err != 0)
{
cout << "初始化套接字库失败!" << endl;
return 0;
}
else
{
cout << "初始化套接字库成功!" << endl;
}
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2)
{
cout << "套接字库版本号不符!" << endl;
WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}
else
{
cout << "套接字库版本正确!" << endl;
}
//定义服务端信息,设置IP和端口号
SOCKADDR_IN server_addr;
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(1234);
while (1)
{
cout << "请输入发送信息:";
//定义发送缓冲区
char send_buf[100];
cin >> send_buf;
//2、创建服务端套接字(socket)。
SOCKET s_server = socket(AF_INET, SOCK_STREAM, 0);
//3、向服务器发出连接请求(connect)。
cout << "连接服务器..." << endl;
if (connect(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout << "服务器连接失败!" << endl;
//关闭服务端套接字,释放资源
closesocket(s_server);
WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}
else
{
cout << "发送信息至服务器端..." << endl;
int send_len = send(s_server, send_buf, 100, 0);
if (send_len < 0)
{
cout << "发送失败!" << endl;
//关闭服务端套接字
closesocket(s_server);
break;
}
//定义接受缓冲区
char recv_buf[100];
int recv_len = recv(s_server, recv_buf, 100, 0);
if (recv_len < 0)
{
cout << "接受服务端信息失败!" << endl;
//关闭服务端套接字
closesocket(s_server);
break;
}
else
{
cout << "来自服务端的信息:" << recv_buf << endl;
}
//4、关闭服务端套接字
closesocket(s_server);
}
}
WSACleanup();//调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源
return 0;
}

参考链接:

https://blog.csdn.net/qq_27923041/article/details/83857964

https://www.cnblogs.com/lishennan/p/4362963.html 

使用Win32控制台实现socket通信的更多相关文章

  1. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  2. flex与C# Socket通信

    原文地址:http://blog.csdn.net/LX10752p/archive/2011/04/27/6366526.aspx Socket 通信没什么好说,一个服务端,多个客户端,很容易搭建环 ...

  3. Unity3d socket通信 切换到web版本时报错SecurityException解决办法

    原文地址:传送门 今天苦战了一天,就跟一个Unity切换到web平台的socket通信出错苦苦纠缠了一天,问了好多大牛,但他们的回复都是我没搞过web平台下的通信或者我只专研于pc或者移动平台.看来没 ...

  4. VS下使用Google Protobuf完成SOCKET通信

    如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...

  5. C# — Socket通信实现

    昨天晚上在网上查找资料,简单实现了C#开发的Socket通信,以下是具体的开发流程,我使用的是VS2017进行开发的: 一.服务器端: 1.新建一个项目,Windows控制台程序 2.重命名cs文件 ...

  6. python - socket通信笔记

    参考: 通过编写聊天程序来熟悉python中多线程和socket的用法:https://www.cnblogs.com/mingjiatang/p/4905395.html python socket ...

  7. 使用 AT 指令进行 Socket 通信

    BC26 支持使用 Socket 进行 TCP 和 UDP 协议通信,这两个协议也是 BC26 支持的众多通信协议的基础.本文讲解如何使用这两个协议与服务器端进行通信.在学习这篇文章前,请首先使用AT ...

  8. C++服务器与java进行socket通信案例

    分类: [java]2012-10-08 12:03 14539人阅读 评论(46) 收藏 举报 注:本代码版权所有!!!转载时请声明源地址:http://blog.csdn.net/nuptboyz ...

  9. C++Socket通信(客户端和服务器)

    win32控制台版 获取本机IP: cmd:       ipconfig/all 我写的是一个服务器和客户端点对点的信息传递(实现相互的可以适当更改代码): 服务器发送给客户端的是一个结构体数据 t ...

  10. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

随机推荐

  1. WorldWind源码剖析系列:WorldWind瓦片调度策略说明

    1 基于源码的分析 首先我们来看WorldWind中摄像头变化相关的几个方法的内部逻辑. 1.1 NltTerrainAccessor. GetElevationAt 方法声明:public over ...

  2. 并发和并行 | Python中实现多线程 threading 和多进程 multiprocessing

    并发和并行 | Python中实现多线程 threading 和多进程 multiprocessing 昨天晚上组会轮到我汇报技术内容,最近正在和 ray 以及 spark 打交道,索性讲一下并发和并 ...

  3. TestProject 使用汇总

    1. 截图 from addons.screenshot_utils import ScreenshotUtils step_output = driver.addons().execute( Scr ...

  4. 深入理解ASP.NET Core 管道的工作原理

    在 .NET Core 中,管道(Pipeline)是处理 HTTP 请求和响应的中间件组件的有序集合.每个中间件组件都可以对请求进行处理,并将其传递给下一个中间件组件,直到请求到达最终的处理程序.管 ...

  5. 前端(二)-CSS

    1.样式 1.1 行内样式 <h1 style="color:red;">行内样式</h1> 1.2 内部样式 CSS代码写在 <head> 的 ...

  6. 使用Python的一维卷积

    学习&转载文章:使用Python的一维卷积 背景 在开发机器学习算法时,最重要的事情之一(如果不是最重要的话)是提取最相关的特征,这是在项目的特征工程部分中完成的. 在CNNs中,此过程由网络 ...

  7. HPC云化部署的优势和挑战

    本文分享自天翼云开发者社区<HPC云化部署的优势和挑战> 作者:土豆炒肉丝 HPC云化部署指的是将高性能计算(HPC)工作负载部署在云计算平台上,这种方式带来了一些明显的优势,但同时也面临 ...

  8. 一个基于 C# 开源的第三方 OAuth2 授权登录整合库

    前言 在我们的开发工作中有可能会对接过各种各样的第三方平台的登录授权,来获取用户的相关账号信息(如:微信登录.支付宝登录.飞书登录.钉钉登录.GitHub登录等等).今天大姚给大家推荐一个基于 C# ...

  9. 基于iscsi存储池

    命令行 [root@kvm1 ~]# virsh pool-define-as --name stor2 --type iscsi \ > --source-host 192.168.114.1 ...

  10. NetCore.Encrypt —— 整合加密

    前言 最近呢又接触到加密了,回顾之前用到的加密经历,使用过DES.RSA.MD5.BASE64,前面也更新过两篇加密的文章,MD5加密和DES加密.之前的使用都是在.Net Framework平台,这 ...