Linux网络编程—socket、bind

一、socket创建套接字

socket是用来创建网络通信或本地通信的套接字,跟文件有关:告诉系统,PCB(进程控制块)控制的数据应该向哪个套接字写入、或读取;这个套接字是在TCP/IP协议下运行的

#include <sys/types.h>        //头文件

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

 三个参数:domain、type、protocol

1.domain:域名,领域,定义域(中文解释)

使用:表示程序员想要表示,通信在哪个域中进行?,是本地域通信?还是网络域通信?

本地域通信 [ AF_UNIX, AF_LOCAL        (Local communication) ]   

网络域通信 [ AF_INET         (IPv4 Internet protocols)]

2.type:类型(中文解释)

使用:程序员想要表示:通信传输类型,是面向数据报还是面向字节流?

面向数据报:SOCK_DGRAM

面向字节流:SOCK_STREAM 

3.protocol:协议(中文解释)

使用:前两个参数,一个在网络上通信(IPV4协议),一个规定了通信传输类型(TCP协议)两个组成了TCP/IP协议(传输层/网络层协议);一般来说,前两个订好了,第三个参数设置为0;

二、bind绑定

IP地址:本地服务器接收数据的IP地址;细节:现实中,IP地址是配置在网卡上的;网络中的每一台服务器可以有多个网卡,也就意味着可以一个服务器可以有多个IP地址(无论是虚拟配置,还是现实配置);如果绑定单一的IP地址,意味着该进程只能从此进程只能接收该网卡的数据传送;其余的网卡对该进程无任何作用;所以使用参数INADDR_ANY;可以接受所有网卡的数据;只要端口号正确就行

port端口号:确定主机中的唯一程序;

bind:将用户设置的ip和port,在内核中和我们的进程强关联

#include <sys/types.h>        //头文件
#include <sys/socket.h>

#include <netinet/in.h>        //后两个是结构体的头文件

#include <arpa/inet.h>

int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
 

参数:

1.sockfd:套接字

使用:socket的返回值->套接字

2.struct sockaddr结构体

这个结构体对象是要和网络进行绑定的;

socket API 是一层抽象的网络编程接口 , 适用于各种底层网络协议 , IPv4 IPv6, 以及后面要讲的 UNIX Domain Socket(本地通信套接字). 然而 , 各种网络协议的地址格式并不相同—— struct sockaddr本身就是一种存放网络协议的地址格式的结构体
2.1struct sockaddr结构体是一个通用型结构体

下图是他们在内存中的存储方式(具体的请看Linux头文件定义表)

 struct sockaddr   :通用结构体类型

struct sockaddr_in:网络通信使用此结构体:遵守IP协议

struct sockaddr_un:本地通信使用此结构体

sockaddr结构:

 sockaddr_in结构:

 in_addr结构:IP地址

16位地址类型:描述本地通信还是网络通信的结构体;这个结构体对象是用来网络通信还是本地通信;

16位端口号:未来可能会把端口号发送给对方主机:所以要进行大端处理:函数htons();

32位IP地址:将点分十进制换成4字节进制,并进行大端处理;函数inet_addr()


 2.2大小端转化函数

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

这些函数名很好记 ,h 表示 host,n 表示 network,l 表示 32 位长整数 ,s 表示 16 位短整数。
例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序 , 例如将 IP 地址转换后准备发送。
如果主机是小端字节序 , 这些函数将参数做相应的大小端转换然后返回 ;
如果主机是大端字节序 , 这些 函数不做转换 , 将参数原封不动地返回。
2.3socklen_t addrlen

使用:结构体的长度;

3.总结

此函数的三个参数,sockfd套接字,告诉了系统向哪里写数据,并对此进行操作(并遵守TCP/IP协议);struct sockaddr定义了自己的IP地址和端口号;确定了网络上的唯一的锚点;完成了先描述的概念;两者绑定;

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值