[Linux网络编程]Socket套接字

本文深入探讨Linux中的Socket套接字,包括套接字的概念、通信方式对比、套接字函数解析(如Socket、Bind、Listen、Accept、Connect)以及实例演示。通过讲解TCP/IP的三次握手和套接字在长连接与短连接中的应用,帮助读者理解套接字在网络编程中的重要作用。
摘要由CSDN通过智能技术生成

     socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。
    通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
    这个数据报格式套接字可以达到高质量的数据传输。这是因为它使用了 TCP 协议

09-05补充
1 网络字节序 主机字节序 和点分十进制之间的转换
2 长连接和短链接
3 三次握手 注意同步确认序号 或者说请求和应答(总而言之三件事 同步 协商 确认)以及SYN ACK
之前写的参考1
三次握手2
listen第二个参数数字的含义[随手笔记]
为什么是三次握手和四次挥手[随手笔记]

1 套接字的概念

Linux当中的一种文件类型,伪文件,不占用存储空间,可进行IO操作,可间接看做文件描述符使用。

2 通信方式有哪几种,Socket有什么区别

通信方式:信号量 管道 消息队列 共享内存 套接字
区别:套接字支持网络上两台以上的设备进行通信,其他其中只能在一台设备上
原因: Socket有双个缓冲区

在这里插入图片描述

3 如何利用套接字进行读写交流

  1. 服务器通过accept函数返回值可以获得客服端的套接字,我们就可以对客服端进行IO(读写)操作
  2. 客服端通过connect函数的第一个参数绑定服务器,我们就可以对服务器进行IO(读写)操作
  3. 将套接字看做文件描述符使用,更好理解
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

4 Socket模式流程图

在这里插入图片描述

5 网络套接字函数详解

Linux查看手册 man 2 函数名称

5.1 Socket( )函数

作用:
用于服务器和客户端,创建套接字,返回一个可操作的文件描述符
参数使用:

  • int socket(int domain,int type,int protocal);

  • 参数一:表示ip地址类型,常用的有两种

    • 其中AF_INET表示IPv4地址,比如127.0.0.1,这是一个本机测试ip
    • 其中AF_INET6表示IPv6地址,比如2001:3CA1:10F:1A:121B:0:0:10
  • 参数二:表示数据传输方式/套接字类型,常见两种

    • SOCK_STREAM(流格式套接字/面向连接的套接字)
    • SOCK_DGRAM (数据报套接字/无连接的套接字)
  • 参数三:表示传输协议,理论上前两个参数已经可以推演出采用哪种协议主要是为了解决,两种不同的协议支持同一种地址类型和数据型。如果我们不指明使用哪种协议,操作系统是没办法自动推演的。如果两种情况只有一个协议满足条件,可以将protocol 的值设为 0,系统自动推演出采用哪种协议

  • 返回值:返回一个套接字(文件描述符fd)

5.2 bind( )函数

作用:
用于服务器,给sockfd套接字绑上本机地址和使用端口,确定了服务器的身份
参数使用:

  • Int bind(int sockfd,const struct sockaddr*addr,socklen_t addrlen);
  • 参数一:套接字的fd(文件描述符),socket()函数的返回值
  • 参数二:结构体 ip+port(端口)

struct sockaddr_in{
    (涉及强制转换sockaddr_in ->sockaddr  参考)
	short int sin_family;              //地址族
	unsigned short int sin_port;       //端口号
	struct in_addr sin_addr;           //IP地址
}
struct in_addr {
   
     __be32 s_addr;
};
  • 参数三:结构体的字节长度
  • 返回值:判断成功失败

5.3 listen( )函数

函数作用:
用于服务器,使socket处于监听模式,监听时候有客户端连接,并放入队列(也可以说,设置同时与服务器建立连接的上限)(同时进行3次握手连接的客户端数量)
参数使用:

  • int listen(int sockfd,int backlog);
  • 参数一:bind绑定ip和端口的套接字
  • 参数二:请求链接客户端队列的最大存放数目
  • 返回值:判断成功失败

5.4 accept( )函数

函数作用:
用于服务器,接收一个客户端的连接请求,并返回连接客户端的套接字便于IO操作,如果没有客户连接会阻塞等待。
参数使用:

  • int accept(int sockfd,struct sockaddr*addr,socklen_t*addrlen)
  • 参数一:服务器的套接字(也叫监听套接字),表明了自己的身份
  • 参数二:传出参数,跟我建立连接的客户端的结构体(内含客户端ip+端口)
  • 参数三: 结构体长度的指针 &sizeof()
  • 返回值:连接客户端的套接字

5.5 connect( )函数

函数作用:
用于客户端,函数可以和自动与远端服务器建立连接
参数使用:

  • int connect(int sockfd,struct sockaddr*serv_addr,int addrlen)
  • 参数一:传入参数,文件描述符绑定连接成功的服务器套接字便于在客户端对服务器进行IO操作
  • 参数二:绑定我要链接服务器的结构体(需要初始化绑上ip和断口),表明目的
  • 参数三:结构体的长度

6 代码实例+详细注释(重)

代码部分要求是能够自主写出,不查看,比较重要。

6.1 实现客户端与服务器消息互发

服务器

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define SER_PORT 8000
int main(void)
{
   
	int sockfd,connfd;//
	int len;
	char wbuf[1024];
	char rbuf[1024];
	struct sockaddr_in serveraddr,clientaddr; //两个结构体 一个用于绑定身份到套接字  一个用于接收客服端的结构体
	//1.创建监听套接字
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	//2.bind(通信需要套接字 把家的地址 门牌号绑上去 ip和端口)
	bzero(&serveraddr,
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Windalove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值