linux网络编程Internet Socket地址,套接字,和函数

文章内容节选《linux/UNIX 系统网络编程》

Internet domain socket地址有两种:IPv4 IPv6

IPv4被存储在结构体中, 该结构体在 netinet/in.h 中进行定义

cd usr/include/netinet/in.h
struct in_addr
{
    in_addr_t s_addr;    //32位IPv4地址
}

struct sockaddr_in
{
    sa_family_t     sin_family;  //地址族
    in_port_t       sin_port;    //16位TCP/UDP端口号
    struct in_addr  sin_addr;    //32位IP地址
    unsigned char   __pad[X];     //不用这个
};

sin_family

每种协议族适用的地址族均不同.如IPv4使用4字节地址族,IPv6使用16字节地址族.sa_family是协议簇通常大多用的是都是AF_INET,表示tcpip协议。

用法

struct sockaddr_in server_address;
server_address.sin_family=AF_INET;
AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型
AF_INET6 则是 IPv6 的

sin_port

以网络字节序保存16位端口号
为了使网络程序具有可移植性,使同样的C代码在大端和小段计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
h表示Host,n表示Network,l表示32为长整数,s表示16位短整数 
如果主机是小端字节序,这些函数将参数做相应的大小端转换后返回 
如果主机是大端字节序,这些函数不做转换,将参数直接返回

用法:

int main(int argc, char* argv[])
{
//输入./a.out 192.168.42.1 9000
addr.sin_port = htons(atoi(argv[2]));
}

sin_addr

用法

server_address.sin_addr.s_addr=inet_addr("127.0.0.1");

以网络字节序保存32位IP地址信息.

socket套接字:

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,
socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭).
说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

套接字描述符

其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr

文件描述符对象FILE *
0标准输入Standard Inputstdin
1标准输出Standard Outputstdout
2标准错误Standard Errorstderr

基于TCP/IP的服务器端/客户端函数调用关系

这里写图片描述

TCP客户端的默认函数调用顺序

  • socket()创建套接字
  • connect()请求连接
  • read()/write()交换数据
  • close()断开连接

TCP服务器端的默认函数调用顺序

  • socket()创建套接字
  • bind()分配套接字地址
  • listen()等待连接请求状态
  • accept()允许连接
  • read()/write()数据交换
  • close()断开连接

函数

创建socket套接字(TCP/UDP,客户端+服务器)

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

绑定端口号(TCP/UDP,服务器)

int bind(int socket,const struct sockaddr *address,socklen_t address_len);

开始监听socket(TCP,服务器)

int listen(int socket,int backlog);

接收请求(TCP,服务器)

int accept(int socket,struct sockaddr *address,socklen_t *address_len);

建立连接(TCP,客户端)

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值