当前位置: 首页 > news >正文

网络编程之简单socket通信

一.什么是Socket?

Socket,又叫套接字,是在应用层和传输层的一个抽象层。它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

 socket分为流socket和数据报socket,分别基于tcp和udp实现。

SOCK_STREAM 有以下几个特征:

  1. 数据在传输过程中不会消失;
  2. 数据是按照顺序传输的;
  3. 数据的发送和接收不是同步的。

UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接

请注意,网络连接也是一个文件,它也有文件描述符!你必须理解这句话。

与 UNIX/Linux 不同的是,Windows 会区分 socket 和文件,Windows 就把 socket 当做一个网络连接来对待,因此需要调用专门针对 socket 而设计的数据传输函数,针对普通文件的输入输出函数就无效了。

tcpserver代码:

#include "socket.hpp"
#include <iostream>
#include <string>
#include <memory>int main()
{SocketInit socketInit;//创建监听套接字SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sListen == SOCKET_ERROR){std::cout << "监听失败" << std::endl;}//绑定套接字sockaddr_in sock_in;sock_in.sin_family = AF_INET;sock_in.sin_port = htons(1234);sock_in.sin_addr.S_un.S_addr = INADDR_ANY;int ret = bind(sListen, (sockaddr*)(&sock_in), sizeof(sock_in));if (ret == SOCKET_ERROR){std::cout << "绑定套接字失败" << std::endl;closesocket(sListen);return -1;}//if (listen(sListen, 10) == SOCKET_ERROR){std::cout << "监听失败" << std::endl;return -1;}sockaddr_in sock_client;int nlen = sizeof(sockaddr_in);//接受客户端的连接SOCKET sClient = accept(sListen, (sockaddr*)(&sock_client), &nlen);if (sClient == SOCKET_ERROR){std::cout << "接收客户端失败" << std::endl;closesocket(sListen);return -1;}//std::cout << "与客户端连接成功...." << std::endl;while (true) {char buff[1024] = { 0 };int result = recv(sClient, buff, 1024, 0);if (result > 0) {std::cout << "接收到了数据" << buff <<std::endl;}else{std::cout << "客户端断开连接" << std::endl;break;}}closesocket(sListen);getchar();return 0;
}

client代码:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "socketinit.hpp"
#include <iostream>
#include <string>
#include <memory>
#include <WS2tcpip.h>int main()
{SocketInit socketInit;//创建套接字SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sClient == SOCKET_ERROR){std::cout << "创建失败" << std::endl;}//绑定套接字sockaddr_in sock_in;sock_in.sin_family = AF_INET;sock_in.sin_port = htons(1234);sock_in.sin_addr.S_un.S_addr = inet_addr("192.168.152.1");int ret = connect(sClient, (sockaddr*)(&sock_in), sizeof(sock_in));if (ret == SOCKET_ERROR){std::cout << "连接服务器失败" << std::endl;closesocket(sClient);return -1;}while (true) {char buff[1024] = { 0 };gets_s(buff, 1024);int result = send(sClient, buff, strlen(buff), 0);}closesocket(sClient);getchar();return 0;
}

http://www.lryc.cn/news/63640.html

相关文章:

  • 计算机图形辐照度学、光度学
  • 【无功功率控制】连接到无限电网的小型风电场的无功功率控制(Simulink)
  • 使用pandas、xlrd、openpyxl读取Excel
  • Java面试题接口
  • 内存取证小练习-基础训练
  • 【Android -- 开源库】数据库 Realm 的基本使用
  • 基于el-input的数字范围输入框
  • 车联网OTA安全实践
  • 智融合·共未来丨智合同携手百融云创打造合同智能化应用服务平台
  • iOS ARC
  • 【代码随想录】刷题Day13
  • playwright连接已有浏览器操作
  • 深度学习模型评估简单介绍
  • PyTorch——利用Accelerate轻松控制多个CPU/GPU/TPU加速计算
  • 4个很多人都不知道的现代JavaScript技巧
  • 【Java笔试强训 19】
  • JPA整合达梦数据库
  • 制药专业转行软件测试,带我的师傅在这干了两年半,最终还是跑路了......
  • 「SQL面试题库」 No_53 项目员工II
  • Ruby适用于什么类型的开发
  • Mysql数据库的备份恢复
  • C++ 使用动态内存创建一个类
  • 2023年华中杯选题人数公布
  • 【黑马旅游案例记录(结合ES)】
  • 基于 A* 搜索算法来优化无线传感器节点网络的平均电池寿命(Matlab代码实现)
  • 三款自研AI应用引领未来,重塑行业新风尚
  • Kafka的命令行操作
  • 递归,回溯,分治(C++刷题笔记)
  • CentOS 7.6更改yum源
  • 三、进度管理