C++Socket通信(客户端和服务器)
win32控制台版
获取本机IP:
cmd: ipconfig/all
我写的是一个服务器和客户端点对点的信息传递(实现相互的可以适当更改代码):
服务器发送给客户端的是一个结构体数据
typedef struct Date {
float m1;
float m2;
float m3;
float m_roll;
float m_pitch;
float m_rotate;
}Datablock;
上服务器代码(阻塞式的):
#include "stdafx.h"
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using std::cout;
using std::cin;
using std::string;
using std::endl;
typedef struct Date {
float m1;
float m2;
float m3;
float m_roll;
float m_pitch;
float m_rotate;
}Datablock;
int main()
{ cout << "服务器启动!....." << endl;
//初始化winsock
WSADATA wsaD;
WSAStartup(MAKEWORD(, ), &wsaD);
//创建监听套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 绑定主机地址和监听套接字
struct sockaddr_in my_addr; //主机地址
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(); //指定端口
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(slisten, (struct sockaddr *)&my_addr, sizeof(my_addr));
//启动监听
listen(slisten, ); //5是最大连接数
//开始接收数据
struct sockaddr_in c_addr; //客户地址
int addr_len = sizeof(c_addr); SOCKET sconnect = accept(slisten, (struct sockaddr*)&c_addr, &addr_len); //通过监听套接字创建连接套接字 cout << "连接已建立......" << endl; char buf[];
while (true) {
Datablock client_send; cout << "输入(start)开始更改,输入(end)结束服务:" << endl;
cout << "输入发送内容:";
while (cin.getline(buf, ))
{ string rcover = buf;
if (rcover == "end")break;
if (rcover == "start") {
cout << "请以m1-m2-m3-m_roll-m_pitch-m_rotate格式输入数据:" << endl;
char transmit[];
cin.getline(transmit, );
send(sconnect, transmit, strlen(transmit) + , ); //字符串还有个结束标志
memset(transmit, , sizeof(transmit)); } }
return ;
}
客户端:(非阻塞式的)
首先要有宏(一般放在.h文件的头文件区域)

#include "stdafx.h"
#include <iostream>
#include <string>
#include<cstring>
#include <winsock2.h>
#include <WS2tcpip.h>
#include<vector>
#include<sstream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
typedef struct Date {
float m1;
float m2;
float m3;
float m_roll;
float m_pitch;
float m_rotate;
}Datablock;
void splitEx(vector<string>&strs, const string& src, string separate_character)
{ int separate_characterLen = separate_character.size();//分割字符串的长度,这样就可以支持如“,,”多字符串的分隔符
int lastPosition = , index = -;
while (- != (index = src.find(separate_character, lastPosition)))
{
strs.push_back(src.substr(lastPosition, index - lastPosition));
lastPosition = index + separate_characterLen;
}
string lastString = src.substr(lastPosition);//截取最后一个分隔符后的内容
if (!lastString.empty())
strs.push_back(lastString);//如果最后一个分隔符后还有内容就入队 }
float str_float(string a) {
float b;
stringstream ss; //string 转 int
ss << a;
ss >> b;
return b;
}
int main()
{
cout << "客户端启动" << endl;
//初始化winsock
WSADATA wsaD;
WSAStartup(MAKEWORD(, ), &wsaD);
//创建客户端socket
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//连接服务器
u_long iMode = ;//如果设置为0,为阻塞式的
ioctlsocket(sclient, FIONBIO, &iMode);
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET; cout << "请输入局域网IP地址:" << endl;
string ipaddress;
cin >> ipaddress; cout << ipaddress; servaddr.sin_addr.s_addr = inet_addr(ipaddress.c_str()); //指定服务器
servaddr.sin_port = htons(); //指定端口
cout << endl<<"OK" << endl; connect(sclient, (struct sockaddr*)&servaddr, sizeof(servaddr)); //通过套接字连接主机 char buf[]; Datablock resu_data;
while (true) {
//存储接收的字符
int len = recv(sclient, buf, sizeof(buf), ); //通过连接套接字接收数据 if (len > )
{
vector<string>result;
cout << "客户说:" << buf << endl;
string test = buf;
cout << test << endl;
splitEx(result, test, "-");
resu_data.m1 = str_float(result[]);
resu_data.m2 = str_float(result[]);
resu_data.m3 = str_float(result[]);
resu_data.m_roll = str_float(result[]);
resu_data.m_pitch = str_float(result[]);
resu_data.m_rotate = str_float(result[]);
cout << resu_data.m1 << endl;
cout << resu_data.m2 << endl;
cout << resu_data.m3 << endl;
cout << resu_data.m_roll << endl;
cout << resu_data.m_pitch<< endl;
cout << resu_data.m_rotate << endl;
}
} return ;
}
这是一个点对点的,先开server,后开客户端。
C++Socket通信(客户端和服务器)的更多相关文章
- C语言Socket-单工通信(客户端向服务器发送数据)
服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.li ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- Socket通信客户端和服务端代码
这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...
- Java 使用 Socket 实现客户端和服务器的信息交互
服务器 public class Server{ private ServerSocket serverSocket; private Socket socket; private BufferedR ...
- C#应用视频教程1.2 Socket通信客户端实现
接下来我们尝试实现最简单的Socket客户端,为了确保只可能你的代码有问题,服务器要先用别人成熟的代码测试(这也是编程的一个技巧,先不要用自己写的客户端测试自己写的服务器,这样出了问题你也不知道谁有问 ...
- socket | tcp客户端 tcp服务器 udp客户端 udp 服务器 创建方法
tcp服务器 #coding=utf-8 ''' 这里是tcp服务器端,要先启动 ''' import socket import threading bind_ip = "0.0.0.0& ...
- Socket TCP客户端和服务器的实现
import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.S ...
- C#应用视频教程1.3 Socket通信客户端完善
我们先把前面的代码封装成一个完整的类,因为跟网络相关的方法并不一定是建立socket的服务器和客户端,所以还是应该把两个分开,比如获取本机IP,修改本机IP,PING远程主机这些事情应该放在一个单独的 ...
- Socket通信客户端设计(Java)
public class Client extends JFrame implements Runnable{ private JPanel jPanel= new JPanel(); private ...
- Socket通信-客户端
WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) retu ...
随机推荐
- Java开发神器Lombok的使用与原理
在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此.相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复 ...
- java中如何修改事务的隔离级别
事务的特性: 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. (多条语句要么都成功,要么都失败.) 一致性(Consistency)事务前后 ...
- Linux和云供应商Red Hat被IBM以34亿美元的价格收购
导读 今天的主题包括IBM以340亿美元收购Red Hat,人性化是使人工智能成功的关键.两家公司于10月28日宣布,IBM正以340亿美元的价格收购Linux和云技术供应商Red Hat,以期改变云 ...
- 新闻网大数据实时分析可视化系统项目——14、Spark2.X环境准备、编译部署及运行
1.Spark概述 Spark 是一个用来实现快速而通用的集群计算的平台. 在速度方面, Spark 扩展了广泛使用的 MapReduce 计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理 ...
- springcloud gateway 项目打包部署运行
新建一个springboot项目然后做了一个小demo跳转到baidu pom <?xml version="1.0" encoding="UTF-8"? ...
- Linux centosVMware vim 编辑模式、vim命令模式、vim实践
一.编辑模式.命令模式 在一般模式下输入:或/可进入命令模式.在该模式下可进行走索某个字符或字符串,也可保存.替换.退出.显示行号等. /word:在光标之后查找一个字符串word,按n向后继续搜索 ...
- linux问题故障
分析问题的方法论 What-现象是什么样的 When-什么时候发生 Why-为什么会发生 Where-哪个地方发生的问 How much-耗费了多少资源 How to do-怎么解决问题 4. cpu ...
- 十三: 悲观锁&乐观锁:解决丢失更新问题
悲观锁:认为丢失更新一定会出现,可以在查询的时候加入for update 认为丢失更新一定会出现,查询时: select * from account for update;for update : ...
- 继OpenJDK 之后,OpenJFX也将迁移到 Git
导读 近日 OpenJFX 项目负责人 Kevin Rushforth 提交了一份将 OpenJFX 迁移到 GitHub 的提案. OpenJFX 是 JavaFX 的开源实现.JavaFX 是一个 ...
- 图像检索:CEDD(Color and Edge Directivity Descriptor)算法 颜色和边缘的方向性描述符
颜色和边缘的方向性描述符(Color and Edge Directivity Descriptor,CEDD) 本文节选自论文<Android手机上图像分类技术的研究>. CEDD具有抽 ...