C语言实现Windows下的socket编程

2023-05-16

一、UDP(数据报)协议

UDP: User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

1.1Server(服务器):接收端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define PORT 8233
int main()
{
	WSADATA wsaData;
	WSAStartup(0x0202, &wsaData); //初始化Socket
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);//UDP
	if (INVALID_SOCKET == sock)
	{
		cout << "创建socket套接字出错:" << WSAGetLastError() << endl;
		return -1;
	}
	sockaddr_in sa = {AF_INET};
	sa.sin_port = htons(PORT);//绑定的端口
	sa.sin_addr.s_addr = 0;//绑定本机所有IP
	//绑定socket和地址(IP地址和端口)
	int n = bind(sock, (sockaddr*)&sa, sizeof(sa));
	if (SOCKET_ERROR == n)
	{
		cout << "绑定时套接字时出错:" << WSAGetLastError() << endl;
		return -1;
	}
	char str[100];
	sockaddr_in from; //获取(客户端)发送端地址信息
	int lenFrom = sizeof(from);
	//循环接受信息,接收到 "#" 退出循环
	while (true)
	{
		n = recvfrom(sock, str, sizeof(str), 0, (sockaddr*)&from, &lenFrom);
		if (strcmp(str, "#") == 0)
			break;
		cout << "IP:" << inet_ntoa(from.sin_addr) << "PORT:" << htons(from.sin_port) << endl;;
		str[n] = 0;
		cout << str << endl;;
	}
	closesocket(sock);
	WSACleanup();
	return 0;
}

1.2Client(客户端):发送端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define PORT 3473

int main()
{
	WSADATA wsaData;
	WSAStartup(0x0202, &wsaData);
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
	if (INVALID_SOCKET == sock)
	{
		cout << "创建socket套接字出错:" << WSAGetLastError() << endl;
		return -1;
	}
	sockaddr_in sa = {AF_INET};
	sa.sin_port = htons(PORT);
	sa.sin_addr.s_addr = 0;
	bind(sock, (sockaddr*)&sa, sizeof(sa));
	//设置接收端地址(IP和端口信息)
	sockaddr_in to = { AF_INET };
	to.sin_port = htons(8233);
	to.sin_addr.s_addr = inet_addr("127.0.0.1");

	char str[100];
	while (true)
	{
		cin >> str; //输入要发送的信息
		sendto(sock, str, strlen(str), 0, (sockaddr*)&to, sizeof(to));
		if (strcmp(str, "#") == 0)
			break;
	}
	closesocket(sock);
	WSACleanup();
	return 0;
}

二、TCP(传输控制)协议

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

2.1Server(服务器端):

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define PORT 8233
int main()
{
	WSADATA wsaData;
	WSAStartup(0x0202, &wsaData); //初始化Socket
	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);//UDP
	if (INVALID_SOCKET == sock)
	{
		cout << "创建socket套接字出错:" << WSAGetLastError() << endl;
		return -1;
	}
	sockaddr_in sa = {2};
	sa.sin_port = htons(PORT);//绑定的端口
	sa.sin_addr.S_un.S_addr = 0;//绑定本机所有IP

	int n = bind(sock, (sockaddr*)&sa, sizeof(sa));
	if (SOCKET_ERROR == n)
	{
		cout << "绑定时套接字时出错:" << WSAGetLastError() << endl;
		return -1;
	}
	//监听
	listen(sock, 5);

	SOCKET socka = INVALID_SOCKET;
	char str[2048];
	while (true)
	{
		socka = accept(sock, NULL, NULL);
		const char* p = "Welcome to connect";
		send(socka, p, strlen(p), 0);
		while (true)
		{
			int n = recv(socka, str, sizeof(str), 0);
			if (n <= 0)
				break;
			str[n] = 0;
			cout << str << endl;
		}
	}
	closesocket(socka);
	closesocket(sock);
	WSACleanup();
	return 0;
}

2.2Client(客户端):

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define PORT 3473

int main()
{
	WSADATA wsaData;
	WSAStartup(0x0202, &wsaData);
	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
	if (INVALID_SOCKET == sock)
	{
		cout << "创建socket套接字出错:" << WSAGetLastError() << endl;
		return -1;
	}
	sockaddr_in sa = {AF_INET};
	bind(sock, (sockaddr*)&sa, sizeof(sa));

	//服务器地址
	sockaddr_in to = { AF_INET};
	to.sin_port = htons(8233);
	to.sin_addr.s_addr = inet_addr("127.0.0.1");

	//连接
	int n = connect(sock, (sockaddr*)&to, sizeof(to));
	if (n == SOCKET_ERROR)
	{
		cout << "连接服务器时失败:" << GetLastError() << endl;
		return -1;
	}
	char str[2048];
	n = recv(sock, str, sizeof(str), 0);
	str[n] = 0;
	cout << str << endl;
	
	while (true)
	{
		cout << "请输入要发送的信息:";
		cin >> str;
		if (strcmp(str, "#") == 0)
			break;
		send(sock, str, strlen(str), 0);
	}
	closesocket(sock);
	WSACleanup();
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现Windows下的socket编程 的相关文章

随机推荐

  • 黑马程序员C++系统班学习笔记(一)——Linux操作系统一

    黑马程序员C 43 43 系统班链接 xff1a https www bilibili com video av37403127 from 61 search amp seid 61 5509409937472093685 本笔记旨在记录学
  • ubunbtu下基于c++实现MQTT客户端通信

    文章目录 一 MQTT简介1 1 MQTT 服务器 xff08 Broker xff09 是发布 订阅架构的核心1 2 MQTT 网络协议1 3 服务质量1 4 MQTT 数据包结构1 4 1 MQTT固定头1 4 2 MQTT可变头 Va
  • python 提取页面验证码

    以下代码都使用python 43 selenium 实现 xff0c 请先搭建好开发环境 1 页面的验证码若为静态验证码可以使用截屏的方式获取代码如下 driver save screenshot 39 C crawlerScript pi
  • 基于单片机的GPS开发 (four) GPS基础知识

    一 GPS硬件模块 xff1a VCC xff1a 兼容3 3V和5V GND xff1a 地 TXD xff1a 接51单片机的RXD P3 0 RXD xff1a 可接单片机的TXD P3 1 或者直接悬空 PPS xff1a 时钟脉冲
  • 记录:C++打印堆栈信息并优化打印结果

    1 介绍打印堆栈信息函数 头文件 xff1a span class token macro property span class token directive hash span span class token directive k
  • Ubuntu “无法定位软件包”

    Ubuntu 无法定位软件包 问题描述 xff1a 在使用Ubuntu 18 0 4 安装ceres库时安装依赖项时报错 xff0c 如图所示 xff1a 原因分析 xff1a libcxsparse3 1 2软件包是Ubuntu 14 0
  • NVIDIA Jetson TX2:TX2平台介绍

    一 xff1a TX2平台概述 TX2是快速高效的嵌入式AI计算设备 低功耗 xff08 标准 xff09 模式 xff08 7 5w xff09 xff1b 高功耗模式 xff08 15w xff09 xff0c 性能是TX1的两倍 具有
  • VSCode安装配置C++开发环境

    真相需要去探寻 之前已经在VSCode上配置了Golang的开发环境 xff0c 使用起来还是十分舒服的 xff0c 特别是设置了镜像下载地址和掌握了go mod的使用 xff0c 小巧轻便 xff0c 舒爽流畅 最近要用到C 43 43
  • 图像处理的基本操作(灰度化,二值化)

    基本的概念 xff1a 图像的深度 xff1a 图像中像素点占得bit位数 xff0c 就是图像的深度 xff0c 并不是每个像素点分配了多少位内存空间 xff0c 就一定能够要用完 xff0c 深度仅仅标识用于真真能表示颜色的位数 xff
  • Ubuntu如何切换Python版本

    这几天一直在搞小米官方提供的ESP32 WiFi SDK xff0c 过程中遇到了很多坑 xff0c 其中包括Python版本兼容的问题 xff0c 我的Ubuntu 上安装的Python版本是Python3 xff0c 而脚本的使用的是p
  • C++面试宝典:__FILE__,__func__,__LINE__

    C语言中 xff0c FILE xff0c func xff0c LINE 常用于logout xff0c debug调试 注意 xff1a 其使用不需要定义 xff0c FILE 指示当前文件名 xff0c func 指示当前函数名 xf
  • C++面试宝典:头文件引用的顺序

    头文件引用的顺序 当我们有多个头文件的时候 xff0c 特定情况下要注意引用的顺序 如果要在文件a h中声明一个在文件b h中定义的变量 xff0c 而不引用b h 那么要在a cpp文件中引用b h文件 xff0c 并且要先引用b h x
  • c++部署yolov5模型

    C 43 43 部署yolov5模型 前言一 准备模型二 Fastdeploy准备三 调用总结 前言 不可否认 xff0c yolov5在目标检测方面大杀四方 xff0c 在 SOTA 榜上留下过万众瞩目的成绩 xff0c 但是官网代码给的
  • 【信息技术】【2004】基于计算机视觉的无人机自主避障系统中的目标跟踪研究

    本文为瑞典皇家理工学院 xff08 作者 xff1a Johan Driessen xff09 的硕士论文 xff0c 共68页 这篇硕士论文的目的是研究利用商用货架 COTS 硬件和免费 公开可用的计算机视觉库开发一个足够有效的实时自主避
  • 将寄存器地址设为宏对寄存器的值进行操作

    将寄存器地址设为宏 对寄存器的值进行操作 搞了半天才捋清楚 首先 定义一个指针变量 int p 再定义一个变量 int q 61 1 将指针p指向q xff1a p 61 amp q 通过指针对改变q的值 xff1a p 61 0x10 此
  • STM32单片机的八种IO口模式,你应该了解下

    STM32单片机的八种IO口模式 xff0c 你应该了解下 八种IO口模式 STM32有八种IO口模式 xff0c 分别是 xff1a 模拟输入 浮空输入 上拉输入 下拉输入 开漏输出 推挽输出 复用开漏输出和复用推挽输出 1 模拟输入 G
  • C语言实现文件复制的两种方法

    一 使用fread 函数和fwrite 函数 span class token macro property span class token directive keyword define span CRT SECURE NO WARN
  • C++开发模板化动态数组CArray类

    1 头文件 span class token comment Array h span span class token macro property span class token directive keyword pragma sp
  • C语言网络族函数htonl()、htons()、inet_addr()、inet_ntoa()实现

    1 htonl htons 函数实现 1 htonl 将主机数转换成无符号长整型的网络字节顺序 2 htons 将主机数转换成无符号短整型的网络字节顺序 span class token macro property span class
  • C语言实现Windows下的socket编程

    一 UDP 数据报 协议 UDP User Datagram Protocol的简称 xff0c 中文名是用户数据报协议 xff0c 是OSI Open System Interconnection xff0c 开放式系统互联 参考模型中一