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

C++ socket编程(1)

这里是一个socket编程Demo,不考虑出错情况,代码简单,便于了解socket流程。

Demo分为服务器程序和客户端程序,运行需要先启动服务器程序,再启动客户端程序。

服务器会等待连接,客户端连接后,服务发送"connected."给客户端。

然后客户端会与服务器进行10次交互,一个交互为:客户端发一个消息,服务器收到,原样返回给客户端,客户端收到,再发下一个消息。

10次交互完成,关闭链接,两边程序都结束。

服务器程序:

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>#pragma comment (lib, "ws2_32.lib")#define SOCKET_ADDR "127.0.0.1"
#define SOCKET_PORT 1234int main()
{WSADATA wsaData;WSAStartup( MAKEWORD(2, 2), &wsaData);SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);struct sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr));sockAddr.sin_family = PF_INET;inet_pton(AF_INET, SOCKET_ADDR, &sockAddr.sin_addr.s_addr);sockAddr.sin_port = htons(SOCKET_PORT);bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));listen(servSock, 1);SOCKADDR clntAddr;int nSize = sizeof(SOCKADDR);SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);const char *str = "connected.";send(clntSock, str, strlen(str)+sizeof(char), NULL);int i = 10;char szBuffer[MAXBYTE] = { 0 };while (i != 0){memset(szBuffer, 0, MAXBYTE);recv(clntSock, szBuffer, MAXBYTE, NULL);std::cout << szBuffer << std::endl;send(clntSock, szBuffer, strlen(szBuffer)+ sizeof(char), NULL);--i;}closesocket(clntSock);closesocket(servSock);WSACleanup();return 0;
}

客户端程序:

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")#define SOCKET_ADDR "127.0.0.1"
#define SOCKET_PORT 1234int main()
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);struct sockaddr_in sockAddr;sockAddr.sin_family = PF_INET;inet_pton(AF_INET, SOCKET_ADDR, &sockAddr.sin_addr.s_addr);sockAddr.sin_port = htons(SOCKET_PORT );connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));char szBuffer[MAXBYTE] = {0};recv(sock, szBuffer, MAXBYTE, NULL);std::cout << szBuffer << std::endl;int i = 10;while (i != 0){snprintf(szBuffer, MAXBYTE, "Index:%d", i);send(sock, szBuffer, strlen(szBuffer) + sizeof(char), NULL);std::cout << "send:" << szBuffer << std::endl;memset(szBuffer, 0, MAXBYTE);recv(sock, szBuffer, MAXBYTE, NULL);std::cout << "recv:" << szBuffer <<std::endl;--i;}closesocket(sock);WSACleanup();return 0;
}

客户端运行后输出:

connected.
send:Index:10
recy:Index:10
send:Index:9
recy:Index:9
send:Index:8
recy:Index:8
send:Index:7
recy:Index:7
send:Index:6
recy:Index:6
send:Index:5
recy:Index:5
send:Index:4
recy:Index:4
send:Index:3
recy:Index:3
send:Index:2
recy:Index:2
send:Index:1
recy:Index:1

两个程序在VS2019上编译运行通过。

主要交互在while里, 客户端这边是(发,收),服务器这边是(收, 发)。

Linux的socket与Windows类似,区别如下:

1.socket类型不同,

Windows: SOCKET(unsigned __int64)

Linux: int

2.收发函数不同:

Windows: recv/send

Linux: read/write

3.关闭socket不同:

Windows: closesocket(socket)

Linux: close(socket)

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

相关文章:

  • C# 文件夹类的实现与文件属性处理
  • 基于SSM框架和Layui的学院课程安排系统的设计与实现(源码+定制+定制)
  • 【论文笔记】DKTNet: Dual-Key Transformer Network for small object detection
  • 设计模式之适配器模式(Adapter)
  • [git] github管理项目之环境依赖管理
  • 【STM32 Blue Pill编程实例】-SD卡文件读写(SPI接口)
  • 为什么需要软件测试?
  • 成为超人:普通人如何白手起家,富一代和富二代的根本区别是什么?
  • Java 集合 Collection常考面试题
  • C++继承与菱形继承(一文了解全部继承相关基础知识和面试点!)
  • 谷歌DeepMind 德米斯·哈萨比斯 因蛋白质预测AI荣获诺贝尔化学奖
  • 内网笔记大全
  • peft.LoraConfig()参数说明
  • 串口(UART)的FPGA设计(接收与发送模块)
  • JSON 格式化工具:快速便捷地格式化和查看 JSON 数据
  • 【星汇极客】STM32 HAL库各种模块开发之1.8TFT屏幕
  • Excel中使用SQL语句的四种方法
  • 目标检测中的损失函数
  • list库实现
  • MFC工控项目实例二十三模拟量输入设置界面
  • 排序算法总结(三)希尔排序
  • 如何迁移 Linux 服务器 第一部分 - 系统准备
  • 网络IO模型都有哪些
  • 数据结构: 数组在算法中的应用
  • js快速转换时间(时间戳转换成年月日时分秒)
  • LeetCode15.三数之和
  • SpringBoot3.3 优雅启停定时任务
  • 数据结构之二叉搜索树(key模型与key_value模型)
  • 图说几何学2300年重大错误:附着在直线z上的直线段必是z的一部分
  • 汽车网关(GW)技术分析