套接字个人总结

news/2024/11/30 12:36:04/

建议看总结前先看个视频:

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();

不解释,常规操作。


http://www.ppmy.cn/news/445350.html

相关文章

单价数量和总价的公式_知道总价和数量怎么算单价

本文收集整理关于知道总价和数量怎么算单价的相关议题,使用内容导航快速到达。 内容导航: Q1:总价=单价*数量 只改动总价和单价,数量不变,总价与单价是成正比例变化,也就是单价降到原来的45/56,就可以了。 Q2:wps表格中数量乘以单价怎么算总价? 比如数量是A2,单价是B2…

a5m2使用方法 mysql_反転

(2016-09-10 17:01) 新建1.reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{0ddd015d-b06c-45d5-8c4c-f59713854639}\PropertyBag] ThisPCPolicy=Hide [HKEY_LOCAL_MACHINE\SOFTWARE\M…

纸的大小图解_常用纸张尺寸及示意图(A0,A1A3,A4,A5A8)数据源维基百科.PDF

常用纸张尺寸及示意图(A0,A1A3,A4,A5A8)数据源维基百科 mFP Charging-常用纸张尺寸说明 2011-12-09 v2.0 常用纸张尺寸及示意图(A0,A1...A3,A4,A5...A8) 数据源:维基百科 标准定义 ISO 216 定义了A 、B、C 三个系列的纸张尺寸。C 系列纸张尺寸主要使用于信封。 ISO 216 的格式…

无线网卡怎么连接台式电脑

无线网卡怎么连接台式电脑

w ndows10怎么接收无线,教你win10台式电脑没有无线网卡怎么连wifi

无线网络现已很普及,只要在有wifi的区域内,手机或笔记本设备输入密码连接即可上网。好多用户在问win10台式电脑没有无线网卡怎么连wifi?其实台式机连接网卡之后就能够连接WiFi人,如果在没有无线网卡的情况下怎么连接?下面小编教你win10台式…

台式计算机怎么查看网卡号,怎么查看台式机电脑有没有无线网卡?

大家知道很多笔记本电脑上都安装有无线网卡,并且现在很多台式电脑也安装有无线网卡,使用无线网卡的电脑,我们连接WIFI上网就非常方便了,那么怎样查看自己的电脑是不是安装有无线网卡呢?小编这里介绍下具体的查看方法&a…

台式计算机无线网卡怎么找,怎么找出台式电脑中的无线网卡驱动

呵呵 好巧 正好我家昨天安装的无线路由 我就不给你粘贴那些网上的了 我看后都没怎么明白,最后还是自己弄了好久才好的(呵呵,可能是我智力问题)。你先把网线一端插在猫上,另一端插在无线路由后面的Internet处(这个另一端就是原本你不用无线路由…

台式计算机安装无线网卡,如何在台式计算机主机上安装无线网卡

将2113与桌面无线网卡一起使用的步骤: 将无线网卡的USB接口插入台式计算机5261主4102计算机背面的UBS接口. 完成后,我们进入1653计算机设备管理器,以查看计算机是否识别该设备. 如果无法识别该设备台式机无线网卡,则请检查无线网卡和计算机之…