本示例使用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. Go基于观察者模式实现的订阅/发布

    面UCloud的时候问到了这题,下来看了一下是基于观察者模式实现的,仅作记录 /** * @Author: lzw5399 * @Date: 2021/5/20 20:38 * @Desc: 基于观察 ...

  2. C# HttpClient 流式响应

    有些时候需要边请求边显示响应内容: 用httpClient.SendAsync(httpreq, HttpCompletionOption.ResponseHeadersRead); private ...

  3. 注册表判断是否安装微软Edge浏览器

    自己摸索的,注册表判断是否安装微软Edge浏览器: bool checkInstalledMsEdge() { try { using(var ieKey = Registry.LocalMachin ...

  4. 分库分表(1) --- ShardingSphere(理论)

    ShardingSphere---理论 ShardingSphere在中小企业需要分库分表的时候用的会比较多,因为它维护成本低,不需要额外增派人手;而且目前社区也还一直在开发和维护,还算是比较活跃. ...

  5. 云辅助隐私集合求交(Server-Aided PSI)协议介绍:学习

    原文来自:云辅助隐私集合求交(Server-Aided PSI)协议介绍,下面学习一波,并记录一些笔记. 背景 总结: 1.PSI-CA和PSI相比,前者在乎的是交集的大小,后者在乎的是交集本身.另外 ...

  6. 卸载CentOS7自带的jdk

    卸载CentOS7自带的jdk 问题描述 在安装完centOS 7虚拟机后,执行 java -version,发现系统自带jdk8.因为我想使用jdk11,安装并配置环境变量后,环境变量仍显示为jdk ...

  7. .NET最佳实践:避免滥用Task.Run

    在 C# 中,Task.Run 是用来在后台线程中执行异步任务的一个常见方法. 它非常适用于需要并行处理的场景,但如果不加以谨慎使用,可能会导致额外的线程池调度,进而影响程序的性能. 什么是线程池? ...

  8. Linux mint安装百度云

    deb包下载 BCloud 作者官网https://github.com/XuShaohua/bcloud-packages 链接: https://pan.baidu.com/s/1hskY04G ...

  9. 任务调度器Azkaban(Azkaban环境部署)

    文章链接:https://www.cnblogs.com/liugp/p/16273966.html

  10. Maven配置多仓库

    一.配置说明 <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="htt ...