使用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组件有很多类似的.本人使用的是自己 ...
随机推荐
- 【狂神说Java】Java零基础学习笔记-Java流程控制
[狂神说Java]Java零基础学习笔记-Java流程控制 Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.ja ...
- Map中经常被忽略但又非常好用的方法
1. 简介 map是我们日常开发中常会的集合类之一, 但是我们除了常用的get和put之外,其他的方法好像很少会用到,接下来我们就介绍一下几个经常被忽略但又很好用的方法. 2. Quick Start ...
- Solution Set -「NOIP Simu.」20221111
\(\mathscr{A}\sim\) 遗忘十字路 Cover:「CF 1746D」Paths on the Tree. Tag:「C.性质/结论」 最原始的思路自然是 DP. 令 \(f ...
- WPF Play Image slider animation using Storyboard
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...
- net core 中的[FromBody]
一.针对.net core中post类型的api注意的地方(前提是Controller上加[ApiController]特性).默认是这个. 1.如果客户端Content-Type是applicati ...
- MySQL---锁、变量、存储过程、游标、自定义函数
一概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制. MySQL各存储引擎使用了三种类型 ...
- 轮播图,swiper使用
背景: 最近接到一个需求,重写首页,需要用到轮播图. 但是轮播图只用两张图,此为前提. 本想直接用ElementUI的走马灯,但是只用两张图的情况下,走马灯不能循环播放,只能来回播放,公司的UI小姐姐 ...
- linux如何使用ssh进行远程服务
/*********************linux SSH 简单学习********************/ 什么是SSH SSH 为 Secure Shell 的缩写,由 IETF 的网络小组 ...
- Java中用Deque接口代替Stack接口完成栈功能
之前在有需要用到栈功能的时候,都是通过使用Stack接口完成的,也就是: 1 Stack<T> stack = new Stack<>() 但今天突然发现,Java Doc里建 ...
- flutter设置导航栏顶部标题与组件Text和Center和Container详解
无状态组件和有状态组件的介绍 StatelessWidget 是无状态组件,状态是不可以改变的 StatefulWidget 是有状态组件 持有的状态可能在 widge 生命周期中改变 Statele ...