简单的c++服务端与客户端的通信
本篇博客是本人没有深入学习网络通信,对其浅浅的了解了一下,只知道怎么连接以及发送内容,若内容有什么错误的地方还麻烦各位大佬可以指出来大家一起讨论一下。
服务端代码如下:
#include <iostream>
#include<stdlib.h>
#include<string>
#include "winsock2.h" //头文件
#include<WS2tcpip.h>
#pragma comment (lib,"ws2_32.lib")
using namespace std;
DWORD WINAPI threadpro(LPVOID pParam) //线程函数
{SOCKET hsock = (SOCKET)pParam; //定义一个套接字char buffer[1024] = { 0 };char sendbuffer[1024];if (hsock != INVALID_SOCKET)cout << "Start Receive" << endl;while (1) //循环接受客户端发来的消息,并且以另一种方式发送给客户端{int num = recv(hsock, buffer, 1024, 0);if (num >= 0)cout << "Receive form client" << buffer << endl;cout << WSAGetLastError() << endl;if (!strcmp(buffer, "A")){memset(sendbuffer, 0, 1024);strcpy_s(sendbuffer, "B");int ires = send(hsock, sendbuffer, sizeof(sendbuffer), 0);cout << "send to client" << sendbuffer << endl;}else if (!strcmp(buffer, "C")){memset(sendbuffer, 0, 1024);strcpy_s(sendbuffer, "D");int ires = send(hsock, sendbuffer, sizeof(sendbuffer), 0);cout << "send to client" << sendbuffer << endl;}else if (!strcmp(buffer, "exit")){cout << "client close" << endl;cout << "sever process close" << endl;return 0;}else{memset(sendbuffer, 0, 1024);strcpy_s(sendbuffer, "ERR");int ires = send(hsock, sendbuffer, sizeof(sendbuffer), 0);cout << "send to client" << sendbuffer << endl;}}return 0;
}int main(){WSADATA wsd;DWORD err = WSAStartup(MAKEWORD(2, 2), &wsd);cout << err << endl;SOCKET m_sockserver; //套接字sockaddr_in serveraddr; //服务器地址sockaddr_in serveraddrfrom;SOCKET m_server[20]; //可接受最大的连接数serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(4600);serveraddr.sin_addr.S_un.S_addr = htonl(2130706433);m_sockserver = socket(AF_INET, SOCK_STREAM, 0); //定义套接字int i = bind(m_sockserver, (sockaddr*) & serveraddr, sizeof(serveraddr)); //与该地址进行绑定,成功则返回0cout << "bind:" << i << endl;int imaxconnect = 20;int iconnect=0;int ilisret;char buf[] = "this is server\0";char warnbuf[] = "it is over max connect\0";int len = sizeof(sockaddr);while (1){ilisret = listen(m_sockserver, 0); //进入监听模式,流式传输只可以在监听模式下才可以连接m_server[iconnect] = accept(m_sockserver, (sockaddr*)&serveraddrfrom, &len);//接受连接申请if (m_server[iconnect] != INVALID_SOCKET){int ires = send(m_server[iconnect], buf, sizeof(buf), 0); //向其发送内容cout << "accept" << ires << endl;iconnect++;if (iconnect > imaxconnect){int ires = send(m_server[iconnect], warnbuf, sizeof(warnbuf), 0);}else{ //启动线程HANDLE m_handle;DWORD nThreadId = 0;m_handle = (HANDLE)::CreateThread(NULL, 0, threadpro, (LPVOID)m_server[--iconnect], 0, &nThreadId);} }}WSACleanup();return 0;
}
具体客户端的代码如下:
#include<iostream>
#include<stdlib.h>
#include"winsock2.h"
#include<time.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;void main()
{WSADATA wsd; //定义一个WSADATA对象WSAStartup(MAKEWORD(2,2),&wsd); //初始化WSASDATA对象SOCKET m_sockclient; //定义套接字sockaddr_in clientaddr; //定义连接的地址clientaddr.sin_family = AF_INET;clientaddr.sin_port = htons(4600);clientaddr.sin_addr.S_un.S_addr = htonl(2130706433);m_sockclient = socket(AF_INET, SOCK_STREAM, 0);int i = connect(m_sockclient, (sockaddr*)&clientaddr, sizeof(clientaddr)); //与服务器地址连接cout << "connect" << i << endl;char buffer[1024];char inbuf[1024];int num;num = recv(m_sockclient, buffer, 1024, 0); //接受服务端发来的信息if (num > 0){cout << "Receive form server" << buffer << endl;while (1) //循环向服务端发生消息{num = 0;cin >> inbuf;if (!strcmp(inbuf, "exit")) //只要输入的不是exit就一直循环下去{send(m_sockclient, inbuf, sizeof(inbuf), 0);return ;}send(m_sockclient, inbuf, sizeof(inbuf), 0);num = recv(m_sockclient, buffer, 1024, 0);if (num >= 0)cout << "receive form server" << buffer << endl;}}
}
注意这里一直存在一个新手很无奈的问题,我已经写出来了代码并且可以运行但是一直在报错,如果遇见这样的问题可以尝试 先运行服务端的代码,在运行客户端的代码。
如上的代码运行结果如下:
服务端和客户端的代码书写有一些相同的地方:
下面的图可以给大家一些参考:(对于连接流传输和非连接流传输的代码架构)
对于遇到无连接流和连接流大概的步骤就如上图所示,具体细节可以期待一下下一期的博客会详细介绍服务器使用的一些函数的具体应用例如send(),bind(),listen(),recv()等等一些函数的具体用法,以及参数所代表的的含义都会在下篇博客写出。
很期待大家评论反馈内容的不足,大家一起学习进步!!!
简单的c++服务端与客户端的通信相关推荐
- Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...
- Java中利用socket实现简单的服务端与客户端的通信(基础级)
在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...
- Java中利用socket实现简单的服务端与客户端的通信(入门级)
Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍.首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特 ...
- 使用WebSocket实现服务端和客户端的通信
开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...
- Java实现服务端和客户端的通信(文件下载)
网络编程 网络通信的介绍 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据 两台电脑连在一起就组成了一个计算机网络.我们通过光纤连接到电信的网关,中国电信通过海底光缆和美国电信网关连接,你 ...
- socket.io服务端是java_SpringBoot(23) 集成socket.io服务端和客户端实现通信
@Slf4j @Service(value = "socketIOService") public class SocketIOServiceImpl implements ISo ...
- SpringBoot(23) 集成socket.io服务端和客户端实现通信
一.前言 websocket和socket.io区别? websocket 一种让客户端和服务器之间能进行双向实时通信的技术 使用时,虽然主流浏览器都已经支持,但仍然可能有不兼容的情况 适合用于cli ...
- netcore 实现一个简单的Grpc 服务端和客户端
参考资料,和详细背景不做赘述. 首先定义prop 文件 syntax ="proto3"; package RouteGrpc; service HelloWorld{ rpc S ...
- Socket代码实现服务端 和 客户端之间通信
服务端代码 // Socket_connection.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #ifndef UNICODE #define ...
最新文章
- Leetcode: Sort List
- Android开发之WebView的开发使用(源代码分享)
- WINDOWS SERVER 2003从入门到精通之组策略应用
- 【ArcGIS Pro微课1000例】0015:ArcGIS Pro中属性字段分式标注案例教程
- Python实现二分法搜索
- php创建mysql分区,MySql创建分区表
- Java中File操作
- 分享一个mysql的docker-compose.yml
- Java设计模式(思维导图)
- DirectX12(D3D12)基础教程(一)——基础教程
- 医学病理图像:细胞间质与间质细胞的区别
- 钢铁侠java_现代版“钢铁侠”,无所不能的程序员,java工程师实现人造器官!...
- 两个高斯分布乘积的理论推导
- 2019小程序发展趋势
- html盒子移动动画代码,js实现盒子滚动动画效果
- PS学习-----------图层锁定的解决办法
- 会议OA之我的会议(查询)
- 空洞卷积原理详解及其pytorch代码实现
- 用计算机能改装成万用表吗,电脑机箱风扇改装成DIY空调扇USB风扇
- Bootstrap系列之警告框(Alert)
热门文章
- MySQL时间戳和unix时间戳区别、MySQL中的时间类型
- 【物理应用】基于摩尔库仑准则实现应变软化岩体的围岩-支护相互作用附matlab代码
- Apple Watch如何进行真机调试及问题汇总
- Pipenv使用总结
- 点阵c语言字节数,用C语言编程16点阵字库!
- 那些炫酷的词云图是怎么做出来的?
- 蓝鲸运维平台5.1.28社区版离线部署
- 替换 PPT 中的视频、音频文件试试这款国产控件
- 使用Python-nmap网络扫描和嗅探工具包
- 解决“Gradient has outdated direction syntax. New syntax is like `to left` instead of `right`.“警告