windows编程--网络编程学习--winsock编程(2)

2023-11-05

       Winsock是windows系统下利用Socket套接字进行网络编程的相关函数,是Windows下的网络编程接口。

       Winsock在常见的Windows平台上有两个主要的版本,即Winsock1和Winsock2。编写与Winsock1兼容的程序你需要引用头文件WINSOCK.H,如果编写使用Winsock2的程序,则需要引用WINSOCK2.H。此外还有一个MSWSOCK.H头文件,它是专门用来支持在Windows平台上高性能网络程序扩展功能的。使用WINSOCK.H头文件时,同时需要库文件WSOCK32.LIB,使用WINSOCK2.H时,则需要WS2_32.LIB,如果使用MSWSOCK.H中的扩展API,则需要MSWSOCK.LIB。正确引用了头文件,并链接了对应的库文件,你就构建起编写WINSOCK网络程序的环境了。

       一般来说,比较熟知的网络模型即OSI(Open system Interconnect)模型,它分为七层,即物理层,数据链路层,网络层,传输层,会话层,表示层以及应用层。而真正得到广泛应用的事TCP/IP 模型。在windows系统下,同样采用了TCP/IP模型进行不同主机以及不同网络间的通信。使用Winsock编程,即必须使用TCP/IP等相关协议进行通信。

在Winsock中,提供了TCP/IP协议下使用的套接字地址,即sockaddr_in结构体,在MSDN中查到其结构体的具体定义为:

其中:

  1. sin_family的值必须指定为AF_INET,代表所属地址家族是TCP/IP地址家族;
  2. sin_port代表端口号。我们知道,在TCP/IP协议,正是通过IP地址以及端口号实现端与端的通信。在TCP/IP协议中,有65536个端口号,因此指定为无符号short类型;
  3. in_addr同样是结构体。其结构为:

注:具体的使用方式以及注释都可查阅MSDN;

接下来本文将针对TCP协议具体实现进行简单的介绍。

针对上面的流程图,将对实现过程即相关函数进行介绍:

1、创建套接字:由于采用的是TCP协议,因此必须采用流式套接字,因为TCP协议采取的是字节流的方式进行传输数据的。

socket s;
s=::socert(AF_INET,SOCK_SREAM,0);

其中:


 最后一个参数指定为0的原因是因为在af中已经指定地址格式为TCP/IP协议规定的地址格式,因此最后一个参数协议类型指定为0;

2、绑定地址信息

使用函数bind()即可完成地址信息的绑定。这个过程完成的是套接字和地址信息的绑定。


参照代码:
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(80);
addr.sin_addr.S_un.S_addr=INADDR_ANY;
::bind(s,(sockaddr)&addr,sizeod(addr));

3、作为TCP服务器必须处于监听状态,随时监听客户端的连接请求。这个过程是通过listen()函数实现的。

4、客户端发送连接请求。该函数于bind函数的结构类似。

这里的sockaddr定义的地址指针是服务器的地址指针;

5.服务器接受客户端的连接请求。实现函数为accept(),结构和connect()以及bind()类似,不同的是定义的结构指针应该为客户端的地址指针;

最后将TCP协议的实现代码贴在本文,实现平台是Visual c++6.0中建立控制台应用程序实现。

服务器代码:

#include
   
   
    
    						//包含头文件
#include
    
    
     
     
#include
     
     
      
      
#pragma comment(lib,"WS2_32.lib")			//显式连接套接字库

int main()									//主函数开始
{
	WSADATA data;							//定义WSADATA结构体对象
	WORD w=MAKEWORD(2,0);					//定义版本号码
	char sztext[]="欢迎你\r\n";				//定义并初始化发送到客户端的字符数组
	::WSAStartup(w,&data);					//初始化套接字库
	SOCKET s,s1;							//定义连接套接字和数据收发套接字句柄
	s=::socket(AF_INET,SOCK_STREAM,0);		//创建TCP套接字
	sockaddr_in addr,addr2;					//定义套接字地址结构
	int n=sizeof(addr2);					//获取套接字地址结构大小
	addr.sin_family=AF_INET;				//初始化地址结构
	addr.sin_port=htons(75);
	addr.sin_addr.S_un.S_addr=INADDR_ANY;
	::bind(s,(sockaddr*)&addr,sizeof(addr));	//绑定套接字
	::listen(s,5);								//监听套接字
	printf("服务器已经启动\r\n");				//输出提示信息

	while(true)
	{
		s1=::accept(s,(sockaddr*)&addr2,&n);	//接受连接请求
		if(s1!=NULL)
		{
			printf("%s已经连接上\r\n",inet_ntoa(addr2.sin_addr));
			::send(s1,sztext,sizeof(sztext),0);	//向客户端发送字符数组
		}
		::closesocket(s);						//关闭套接字句柄
		::closesocket(s1);
		::WSACleanup();							//释放套接字库
		if(getchar())							//如果有输入,则关闭程序
		{
			return 0;							//正常结束程序
		}
		else
		{
			::Sleep(100);						//应用睡眠0.1秒
		}
	}
}
     
     
    
    
   
   

客户端代码:

#include
   
   
    
    				//包含头文件
#include
    
    
     
     
#include
     
     
      
      
#pragma comment(lib,"WS2_32.lib")		//显式连接套接字库

int main()							//主函数开始
{
	WSADATA data;						//定义WSADATA结构体对象
	WORD w=MAKEWORD(2,0);					//定义版本号码
	::WSAStartup(w,&data);					//初始化套接字库
	SOCKET s;						//定义连接套接字句柄
	char sztext[10]={0};
	s=::socket(AF_INET,SOCK_STREAM,0);			//创建TCP套接字
	sockaddr_in addr;					//定义套接字地址结构
	addr.sin_family=AF_INET;				//初始化地址结构
	addr.sin_port=htons(75);
	addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	printf("客户端已经启动\r\n");				//输出提示信息
	::connect(s,(sockaddr*)&addr,sizeof(addr));
	::recv(s,sztext,sizeof(sztext),0);
	printf("%s\r\n",sztext);
	::closesocket(s);					//关闭套接字句柄
	::WSACleanup();						//释放套接字库
	if(getchar())						//如果有输入,则关闭程序
	{
		return 0;					//正常结束程序
	}
	else
	{
		::Sleep(100);					//程序睡眠
	}
}

     
     
    
    
   
   



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

windows编程--网络编程学习--winsock编程(2) 的相关文章

随机推荐

  • 微服务化之无状态化与容器化(转载)

    一 为什么要做无状态化和容器化 很多应用拆分成微服务 是为了承载高并发 往往一个进程扛不住这么大的量 因而需要拆分成多组进程 每组进程承载特定的工作 根据并发的压力用多个副本公共承担流量 将一个进程变成多组进程 每组进程多个副本 需要程序的
  • ASP快速入门教程

    ASP快速入门教程 ASP快速入门教程能让你一个小时就学会ASP 如果想看懂更多的ASP代码 希望大家在网上找找ASP教程 相信看完后大家对ASP更有个感性的认识 请熟记下面的ASP语句是你快速入门的不二法则 lt 1 gt lt 2 gt
  • R语言学习:数据结构8-日期和时间

    日期和时间 date time 日期 Date 内部存储的是距离1970 01 01的天数 相关函数 date Sys Date weekdays months quarters 查看日期 date x lt date 查看当前系统日期和时
  • 数据清洗的步骤和注意事项:提高数据分析的准确性和可靠性

    作为一名数据分析师 我深知数据清洗是数据分析的重要一步 数据清洗的质量直接影响到数据分析的准确性和可靠性 在这篇文章中 我将分享一些数据清洗的步骤和注意事项 帮助你提高数据分析的准确性和可靠性 1 确定数据清洗的目标和指标 在开始数据清洗之
  • 腾讯云部署(gin框架+vue3.0)前后端分离项目

    腾讯云部署 gin框架 vue3 0 前后端分离项目 项目架构和部署工具 项目工具 部署工具 后端项目准备及部署 购买云端服务器 以下是腾讯云 阿里云请点击我 https blog csdn net it vegetable article
  • C++ · 求和篇

    C 求和法千万条 等差数列第一条 哈哈 跟大家开个玩笑 现在咱们步入正题 求和法之一 等差数列 没错 等差数列是最简便的解法 众所周知 等差数列求和公式为 首项 末项 项数 2 首项即是等差数列的起始数 末项是等差数列的结束项 好 问题来了
  • 实例化和具体化详解

    在解释具体化和实例化看的有点乱 分解出来备忘 在代码中包含函数模板本身并不会生成函数定义 它只是用于生成函数定义的方案 编译器使用模板为我写类型生成函数定义时 得到的是模板实例 如这个模板 template
  • keil5 编辑栏一直是灰色

    无语了 气炸了 愤怒啊 查了一下 有很多 arm 和 c51 并存 不管他了 之前装了用完51 又装了arm 现在反而什么都用不了 打开license 发现过期了 重新破解 即可 注意音乐 大半夜吓死人 你以为这样就可以了 你就太天真了 网
  • java:最差产品奖

    import java util Scanner 注意类名必须为 Main 不要有任何 package xxx 信息 public class Main public static void main String args Scanner
  • dll文件反编译源代码 C#反编译 dotpeek反编译dll文件后export

    目录 背景 下载安装dotpeek 导入dll文件 export导出文件 参考 背景 项目合作的时候 使用前人的或者其他部门dll文件直接在机台运行 会出现很多问题 逻辑 效率等等 此时我们可以选择对他们的代码进行反编译和重构 重新梳理逻辑
  • Windows C++运行命令编程

    Windows C 运行命令编程 一 命令处理方式 二 popen函数 三 重定向的子进程 四 参考链接 一 命令处理方式 Windows下编程经常需要使用批处理指令 bat或cmd 因此如何执行命令和获取返回数据是一个关键点 对于控制台程
  • STM32+IAP方案的实现,IAP实现原理(详细解决说明)。

    此文档内容摘自 http www 51hei com stm32 4315 html 可参考文档 https blog csdn net gin love article details 82015646 基于STM32F103ZET6的U
  • 力扣 剑指 Offer 25. 合并两个排序的链表

    简单题 就不多写了 class Solution public ListNode mergeTwoLists ListNode l1 ListNode l2 ListNode head new ListNode t head while l
  • 一文读懂大语言模型

    以ChatGPT为代表的大语言模型被很多人认为是新一轮科技革命的起点 本文旨在通过概念性介绍 让普通人能够尽可能理解人工智能以及大语言模型的基本概念 从而了解这些技术能做以及不能做什么 原文 A Very Gentle Introducti
  • 关系表的构成要素主键_关系模型简述

    关系模型简述 关系模型是基于表的处理方式抽象形成的 是在对传统表及其操作进行数学化严格定义基础上 引入集合理论与逻辑学理论提出的 关系模型也是数据库的三大经典数据模型之一 也是现在大多数商品化数据库系统所仍然再用的数据模型 数据库标准语言也
  • 流媒体服务器在大屏系统,视频流媒体服务器

    视频流媒体服务器 内容精选 换一换 音视频传输协议众多 不同业务应该如何选择 RTSP RTMP RTP RTC HLS MSS DASH WEBRTC RIST SRT 在此我们就从业务发展的视角来理解各种流媒体协议 帮助大家有更加清晰的
  • 一行命令跑满Linux的CPU

    今天突发奇想 想看看Linux的CPU跑满的样子 其实一行命令就可以使CPU跑满 for i in seq 1 cat proc cpuinfo grep physical id wc l do dd if dev zero of dev
  • nestjs:创建唯一键报错 QueryFailedError: Duplicate key name ‘IDX_d87a44fac9965cb7cf94cba11c‘

    问题 如题 参考 MYSQL中唯一约束和唯一索引的区别 51CTO博客 mysql主键和唯一索引的区别 解决办法 原始代码 Index Column unique true mail string 创建唯一约束时会创建唯一索引 所以应该把
  • score在java中是什么意思_Score.java

    import java io File import java io FileInputStream import java util Properties import java util Scanner import org jsoup
  • windows编程--网络编程学习--winsock编程(2)

    Winsock是windows系统下利用Socket套接字进行网络编程的相关函数 是Windows下的网络编程接口 Winsock在常见的Windows平台上有两个主要的版本 即Winsock1和Winsock2 编写与Winsock1兼容