技术标签: 职场和发展
建议看总结前先看个视频:
C/C++基础教程:详细讲解socket网络编程上_哔哩哔哩_bilibili
有上中下。
套接字函数总结:
初始化(了解即可):
类型:
WORD //typedef unsigned short WORD;
用于描述版本号,如2.2版本,不能直接在WSAStartup()的第一个参数里输入2.2,会被强制转化为2.因此需要该类型,再加上MAKEWORD来变成函数能够接受的形式。
WSADATA //结构体变量,其他不需要懂太多
用来存储被WSAStartup函数调用后返回的Windows Sockets数据,现阶段不需要用,知道是实现函数的就行。
函数:
WSAStartup() //int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);
参数看上面类型的描述就够了。
执行成功返回0
参数建立:
类型:
SOCKET //typedef unsigned __int64 UINT_PTR typedef UINT_PTR SOCKET;
这定义雀氏很“套接字”。
sockaddr_in //存储端口号和ip地址的结构体
绑定端口号和ip地址常规操作例子:
sockaddr_in sin; //sockaddr_in是系统封装的一个结构体
sin.sin_family = AF_INET; //sin_family主要用来定义地址族
sin.sin_port = htons(8888); //sin_port主要用来保存端口号
sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //填入本机的IP地址
函数:
socket() //SOCKET socket(int af, int type, int protocol);
这个函数返回值为SOCKET,所以你应该懂怎么对SOCKET类型变量进行赋值了吧,
af 为地址族,也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6。
type 为数据传输方式/套接字类型,常用的有 SOCK_STREAM(流格式套接字/面向连接的套接字) 和 SOCK_DGRAM(数据报套接字/无连接的套接字)。
protocol 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。
bind() //int bind(SOCKET sock, const struct sockaddr *addr, int addrlen);
connect() //int connect(SOCKET sock, const struct sockaddr *serv_addr, int addrlen);
socket函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的 IP 地址和端口绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理。类似地,客户端也要用 connect() 函数建立连接。
简单来说,绑定套接字和他的地址端口属性,服务器端要用bind(),客户端要用connect().
Parm1:要被绑定的套接字
Parm2:要被绑定的结构体,由于传入参数为sockaddr,因此需要对sockaddr_in的结构体进行强制转化,不用考虑有没有问题。
如果仍有疑惑请看:(下面为连接)
https://www.xin3721.com/Articlewlgcs/16281.html#:~:text=bind%20%28%29%E5%92%8Cconnect%20%28%29%E5%87%BD%E6%95%B0%EF%BC%9A%E7%BB%91%E5%AE%9A%E5%A5%97%E6%8E%A5%E5%AD%97%E5%B9%B6%E5%BB%BA%E7%AB%8B%E8%BF%9E%E6%8E%A5%20socket%20%28%29%20%E5%87%BD%E6%95%B0%E7%94%A8%E6%9D%A5%E5%88%9B%E5%BB%BA%E5%A5%97%E6%8E%A5%E5%AD%97%EF%BC%8C%E7%A1%AE%E5%AE%9A%E5%A5%97%E6%8E%A5%E5%AD%97%E7%9A%84%E5%90%84%E7%A7%8D%E5%B1%9E%E6%80%A7%EF%BC%8C%E7%84%B6%E5%90%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E8%A6%81%E7%94%A8,bind%20%28%29%20%E5%87%BD%E6%95%B0%E5%B0%86%E5%A5%97%E6%8E%A5%E5%AD%97%E4%B8%8E%E7%89%B9%E5%AE%9A%E7%9A%84%20IP%20%E5%9C%B0%E5%9D%80%E5%92%8C%E7%AB%AF%E5%8F%A3%E7%BB%91%E5%AE%9A%E8%B5%B7%E6%9D%A5%EF%BC%8C%E5%8F%AA%E6%9C%89%E8%BF%99%E6%A0%B7%EF%BC%8C%E6%B5%81%E7%BB%8F%E8%AF%A5%20IP%20%E5%9C%B0%E5%9D%80%E5%92%8C%E7%AB%AF%E5%8F%A3%E7%9A%84%E6%95%B0%E6%8D%AE%E6%89%8D%E8%83%BD%E4%BA%A4%E7%BB%99%E5%A5%97%E6%8E%A5%E5%AD%97%E5%A4%84%E7%90%86%E3%80%82
Parm3:addrlen 为 addr 变量的大小,可由 sizeof() 计算得出。
客户端和服务器端进行交互:
客户端:
send() //int send( SOCKET s,char *buf,int len,int flags );
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。
客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。
(1)第一个参数指定发送端套接字描述符;
(2)第二个参数指明一个存放应用程序要发送数据的缓冲区;
(3)第三个参数指明实际要发送的数据的字节数;
(4)第四个参数一般置0。
send()函数只能在套接字处于连接状态的时候才能使用。(只有这样才知道接受者是谁)
recv() //int recv( SOCKET s, char *buf, int len, int flags)
功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。
参数一:指定接收端套接字描述符;
参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
参数三:指明buf的长度;
参数四 :一般置为0。
服务器端(以下函数按先后顺序来进行解释):
listen() //int listen( int sockfd, int backlog);
sockfd:用于标识一个已捆绑未连接套接口的描述字。
backlog:等待连接队列的最大长度,一般设置为SOMAXCONN,交给系统来动态管理。
当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字。listen函数把一个未连接的套接字转换为一个被动套接字,指示内核应该接受指向该套接字的连接请求。根据TCP状态转换图,调用listen导致套接字从CLOSED状态转换到LISTEN状态。
accept() //int accept(SOCKET s,struct sockaddr FAR * addr,int FAR * addrlen);
第一个参数用来标识服务端套接字(也就是listen函数中设置为监听状态的套接字),
第二个参数是用来保存客户端套接字对应的“地方”(包括客户端IP和端口信息等),
第三个参数是“地方”的占地大小。返回值对应客户端套接字标识。
摘一段博客:
如果没有客户端套接字去请求,它便会在那里一直痴痴地等下去,直到永远(注意, 此处讨论的是阻塞式的socket. 如果是非阻塞式的socket, 那么accept函数就没那么痴情了, 而是会立即返回, 并意犹未尽地对未来的客户端扔下一句话: 我等了你, 你不来, 那就算了, 我懒得鸟你)。
原文链接:https://blog.csdn.net/stpeace/article/details/13424223
recv() 上文提到过
send() 上文提到过
关闭套接字和WSA:
closesocket(SOCKET s);
WSACleanup();
不解释,常规操作。
文章浏览阅读2.5w次,点赞6次,收藏31次。ResponseBodyAdvice接口类:/* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance..._responsebodyadvice
文章浏览阅读991次。日常, 普通人拼车拼房拼自己, 各大公司拼员工拼技术拼实力。每逢佳节, 普通人拼奖金拼福利拼假期, 而各大公司拼的是独树一帜的创意。在一年一度的中秋佳节来临之际, 月饼作为中秋节的福利的代表, 当然是各大公司必不可少的礼品之一。然而如何设计富有公司文化色彩的月饼; 顺带还能为公司品牌宣传一波; 并引起求职小高潮。这就需要丰富的想象力和新颖的创新能力。_各公司月饼礼盒
文章浏览阅读235次。想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】链客,有问必答!!区块链1.0时代:也就是比特币应用中的区块链技术,里面记录着自比特币诞生以来的所有比特币转账交易,相当于比特币网络的“数据库”。其实在区块链1.0时代,也就是比特币运用的区块链技术中已经包含了智能合约的概念,可以说智能合约的引入,使得区块链技术进化为..._学习以太坊区块链需要哪些知识
文章浏览阅读2.9k次,点赞8次,收藏21次。每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(copyer)前言: 这篇博客主要介绍了vuex4的基本使用,从创建一个store对象,然后再store内部的属性进行一一的解释(就是vuex的五大和核心:state, getters,mutations,actions, modules),解释主要从类型,参数等等方面的解释,还是比较的详细。内容有点长,可以收藏起来,慢慢看哟(嘻嘻)vuex介绍 Vuex 是一个专为 Vue.js 应用程序开._actiontree
文章浏览阅读192次。vue 作用域插槽的使用 <div id="app"> <cpn></cpn> <cpn> <!-- 2.获取子组件中的 pLanguage --> <template slot-scope="slot"> <!-- <span v-for="item in slot.data"_vue 插槽中内容数量
文章浏览阅读399次。go get: module github.com/go-sql-driver/mysql: Get "https://proxy.golang.org/github.com/go-sql-driver/mysql/@v/list": dial tcp 142.251.42.241:443: connectex: A connection attempt failed because the connected party did not properly respond after a period o_dial tcp 142.251.42.241:443: connectex: a connection attempt failed because
文章浏览阅读2.1w次,点赞6次,收藏59次。在访问linux时,如果linux防火墙是开启状态,则无法访问其提供的服务,为此,需要将Linux的防火墙关闭,命令如下:查看防火墙状态firewall -cmd --state关闭防火墙systemctl stop firewalld.service开启防火墙systemctl start firewalld.service禁止开机启动启动防火墙=systemctl disable firewalld.service建议自己学习使用的Linux虚拟机可以_linux虚拟机怎么关闭防火墙
文章浏览阅读749次。一 索引的分类1 聚集索引: 就是表中的主键,每个表中只能有一个聚集索引.2 非聚集索引: 根据查询条件的不同设置的索引二 索引使用的场景索引一般建在经常使用的的列上,如用户登录时,经常会根据用户名查出,用户密码,这个时候一般在用户名字段上增加索引1 索引的创建的代码create nonclustered index index_username on user_mssql 索引
文章浏览阅读2.3k次,点赞5次,收藏9次。qml qt for android 安装apk app自动更新_qt android 更新app安装
文章浏览阅读3.9k次。浏览网站实际上是浏览网站中的网页文件。为了便于用户访问,每个站点一般都有自己的默认文档。一般情况下,默认文档都被设置为该网站的主页或某个索引页。默认文档的作用是简便用户的输入,使用户不必在浏览器中输入网站主页的文件名才能访问该网站。例如,网站www.Gench.com.cn将默认主页设置为index.htm,那么,用户在浏览器中输入www.Gench.com.cn时,IIS会自动将页面转换到默认文..._iis中【启用默认内容文档】选项中将默认打开文档修改为程序首页文件格式,如:index
文章浏览阅读5.2w次,点赞86次,收藏373次。以前对箱线图一直一知半解,这次在网上找到一篇不错的文章。首先,箱形图更多用于多组数据的比较,相对直方图不仅节省了空间,还可以展示出许多直方图不能展示的信息。单组数据则更适合采用直方图,使可视化效果更加直观。文章来源于“镝次元”公众号,在此向作者表示感谢。不会数学统计没关系——5分钟教你轻松掌握箱线图 | 图表家族#242018-01-22 19:00编辑:王艺 版面:胡曼君..._箱线图的主要用途是什么
文章浏览阅读1.2k次,点赞22次,收藏15次。每个语言都有控制流语句就不写测试代码了。arkTs绝大部分语法继承自ts,然后有些许的语法特性变化,这部分我也会在入门的时候一并记上。我之前学过java,所以这不是零基础,至少需要会一种编程语言。新建一个鸿蒙App项目,然后开一个设置按钮进行测试没有条件的话,可以在线测试编程代码。在TypeScript中所有的类型都可以被赋值为空类型null,赋值为空类型时可以和其他同类型对象进行运算,但是无法调用这个对象内部本身的方法,会报空指针异常。_鸿蒙arkts语法学