使用Win32控制台实现socket通信
本示例使用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通信的更多相关文章
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- flex与C# Socket通信
原文地址:http://blog.csdn.net/LX10752p/archive/2011/04/27/6366526.aspx Socket 通信没什么好说,一个服务端,多个客户端,很容易搭建环 ...
- Unity3d socket通信 切换到web版本时报错SecurityException解决办法
原文地址:传送门 今天苦战了一天,就跟一个Unity切换到web平台的socket通信出错苦苦纠缠了一天,问了好多大牛,但他们的回复都是我没搞过web平台下的通信或者我只专研于pc或者移动平台.看来没 ...
- VS下使用Google Protobuf完成SOCKET通信
如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...
- C# — Socket通信实现
昨天晚上在网上查找资料,简单实现了C#开发的Socket通信,以下是具体的开发流程,我使用的是VS2017进行开发的: 一.服务器端: 1.新建一个项目,Windows控制台程序 2.重命名cs文件 ...
- python - socket通信笔记
参考: 通过编写聊天程序来熟悉python中多线程和socket的用法:https://www.cnblogs.com/mingjiatang/p/4905395.html python socket ...
- 使用 AT 指令进行 Socket 通信
BC26 支持使用 Socket 进行 TCP 和 UDP 协议通信,这两个协议也是 BC26 支持的众多通信协议的基础.本文讲解如何使用这两个协议与服务器端进行通信.在学习这篇文章前,请首先使用AT ...
- C++服务器与java进行socket通信案例
分类: [java]2012-10-08 12:03 14539人阅读 评论(46) 收藏 举报 注:本代码版权所有!!!转载时请声明源地址:http://blog.csdn.net/nuptboyz ...
- C++Socket通信(客户端和服务器)
win32控制台版 获取本机IP: cmd: ipconfig/all 我写的是一个服务器和客户端点对点的信息传递(实现相互的可以适当更改代码): 服务器发送给客户端的是一个结构体数据 t ...
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
随机推荐
- Vue cli 2.x 3.x及4.x区别
原文链接: 1.Vue cli 2.x 3.x及4.x区别 2.vue-cli2.0/3.0/4.0创建项目的方式差异解读和vue-cli4.0打包命令和环境配置
- ABC 386 (A~F)
赛时做的,结果一直在卡D题.打得很失败的一场. ABC 略. D 题意可以转化为:给定\(m\)个黑色或白色的格子,其中: 每个黑色格子和\((1,1)\)作为对角线顶点,构成一个黑色矩形 每个白色格 ...
- linux安装软件配置
CentOS7更换yum为阿里源 1 备份本地源mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backu ...
- 文章学习 | MPC 是下一代私钥安全的7大原因
文章学习:MPC 是下一代私钥安全的7大原因 前言 多重签名钱包与单一密钥钱包相比,因其提升了资产安全性,如今已成为机构管理加密货币的标准做法.然而,最近在多方计算(MPC)领域的密码学突破正引领私钥 ...
- ctfshow--web14 sql注入利用``的清奇的绕过
输入c=3就会跳出来这个url 复制并访问,看这个页面应该是sql注入 有注释可看,看看他过滤了哪些东西 点击查看代码 if(preg_match('/information_schema\.tabl ...
- VuePress 博客搭建系列 33 篇正式完结!
前言 VuePress 博客搭建系列是我写的第 6 个系列文章,前 5 个系列分别是 JavaScript 深入系列,JavaScript 专题系列.underscore 系列.ES6 系列.Type ...
- 云主机(操作系统:CentOS7版本)安装nfs客户端,挂载文件系统
本文分享自天翼云开发者社区<云主机(操作系统:CentOS7版本)安装nfs客户端,挂载文件系统>,作者:c****n 1.保证宿主机上有nfs-utils 1.1若宿主机yum源不可以用 ...
- presto集成iceberg
一.Presto服务下新建catelog cd /usr/local/service/presto/etc/catalog vim iceberg.properties connector.name= ...
- Luogu P11233 CSP-S2024 染色 题解 [ 蓝 ] [ 线性 dp ] [ 前缀和优化 ]
染色:傻逼题. 赛时没切染色的都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏! 包括我. 真的太傻逼了这题. 我今晚心血来潮一打这题,随便优化一下,就 AC 了. 怎么做到这么蠢 ...
- kvm virtio window server2003
https://www.linux-kvm.org/page/Downloads 这是kvm官网对virtio讲解 http://www.linux-kvm.org/images/d/dd/KvmFo ...