使用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组件有很多类似的.本人使用的是自己 ...
随机推荐
- WxPython跨平台开发框架之列表数据的通用打印处理
在WxPython跨平台开发框架中,我们大多数情况下,数据记录通过wx.Grid的数据表格进行展示,其中表格的数据记录的显示和相关处理,通过在基类窗体 BaseListFrame 进行统一的处理,因此 ...
- C Primer Plus 第6版 第八章 编程练习参考答案
编译环境VS Code+WSL GCC 源码请到文末下载 . 我给第一题写了Linux shell脚本,感兴趣的同学可以尝试修改并运行一下. /*第1题************************ ...
- Note -「基本子串结构」速通笔记
学习自 crashed 的<一类基础子串数据结构>摘抄及注解, 略过了一些 crashed 口中 "用不上" 的东西. 这里是速通笔记, 希望快速学习技巧的读者可以 ...
- Netty5 服务端和客户端-copy
概述netty 5 已经放弃掉了,作为学习netty4和5的差别不大,本例子是基于netty5 https://github.com/netty/netty/issues/4466 线程安全一个thr ...
- 京东从 OpenStack 改用 Kubernetes 的始末
构建集群的历史 物理机器的时代(2004年-2014年) 在2014年之前,我们公司的应用程序都部署在物理机器上.在物理机器时代,为了给即将上线的应用程序分配物理机器,我们平均需要等上一周的时间.由于 ...
- 测试 【子牙-writing】 大模型
参考:姜子牙大模型系列 | 写作模型ziya-writing开源!开箱即用,快来认领专属你的写作小助手吧 封神榜:https://github.com/IDEA-CCNL/Fengshenbang-L ...
- 解析mysql奇葩语句
首先看看完整的表如下图 那么看看一个比较奇葩的语句 select * from users where name = 'aa'='bb'这个语句为啥能执行成功以及为什么打印出了除了两个aa之外的所有行 ...
- RocketMQ实战—8.营销系统业务和方案介绍
大纲 1.电商核心交易场景的业务流程 2.电商支付后履约场景的业务流程 3.电商营销场景的业务说明 4.电商促销活动的Push推送 5.会员与推送的数据库表结构 6.营销系统的数据库表结构 7.营销系 ...
- docker官网镜像无法下载问题解决
亲测可用,这个方法是由技术爬爬虾大佬提供,简单地说就是通过github上的docker_image_pusher项目,将国外docker镜像转存到阿里云私人仓库. 此方法需要你有一个github账号, ...
- 【ABP】项目示例(2)——聚合根和实体
聚合根和实体 在上一章节中,已经完成了项目搭建的前置准备,在这一章节中,实现领域层的聚合根和实体 创建名称为General.Backend.Domain的标准类库,分别新建名称为Entities.Se ...