Liunx系统编程篇—网络编程(三)Socket编程步骤、常用API简析

Socket编程步骤

TCP:

在这里插入图片描述
在这里插入图片描述

UDP:

在这里插入图片描述
在这里插入图片描述

可选的意思就是可以不用

常用API简析

包含头文件

#include<sys/types.h>
#include<sys/socket.h>
1、连接协议(socket)
作用:

用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数

原型:
int socket(int domain,int type, int protocol);
参数:

domain:指明所使用的协议族/域。
常用的domain类型有:
AF_INET IPv4因特网域
AF_INET6 IPv6因特网域
AF UNIX Unix 域
AF ROUTE 路由套接字
AFKEYE 钥套接字
AF UNSPEC 未拖定
type:指定socket类型。
常用的socket类型有:
SOCK_STREAM
TCP:流式套接字提供可靠的、面向连接的通信流:它使用TCP协议,从而保证了数据传输的正确性和顺序性
SOCK_DGRAM
UDP:数据报套接字定义了一种无连按的服,数据通过相互独立的报文进行传输, 是无序的,并且不保证是可靠,无差错的。它使用数据报协议UDP。
SOCK_RAW
允许程序使用低层协议,原始科接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开友。
protocol:通常赋值 0
0表示选择type类型对应得默认协议。
IPPROTO_TCP TCP传输协议
IPPTOTO_UDP UDP传输协议
IPPROTO_SCTP STCP传输协议
IPPROTO_TIPC TIPC传输协议

返回值:

返回:成功时返回非负整数,失败返回 -1。

2、地址准备(bind)
作用:

函数作用:套接字绑定到一个地址,并制定一个端口号。 将套接字绑定一个IP地址和端口号,因为这两个元素可以在网络环境中唯一地址表示一个进程。

原型:
bind( SOCKET sockaddr, const struct sockaddr my_addr,int addrlen);
参数:

sockfd:是一个socket描述符
** addr:**是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针,指向要邦定给sockfd的协议地址结构这个地址结构根据地址创建,socket时的地址协议族的不同而不同。
ipv4对应的结构体:
第一种:

struct sockaddr{
				unisgned short as family;	//协议族
				char sa data[14]; //IP+端口
};

第二种(常用):

struct sockaddr_in{
					sa_family_t sin_family; //协议族
					in_port t sin_port; //端口号
					struct in_addr sin_addr;//IP地址结构体
					unsigned char sin_zero[8];//填充 没有实际意义,只是为跟sockaddh结构在内存中对齐这样两者才能相互转换
};

**addrlen:**第二个参数中结构体的长度。

返回值:
3、监听(listen)
作用:

listen函数使用主动连接套接字变为被连接套接口,使得一个进程可以接受其它进程的请求,
从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。
listen函数一般在调用bind之后-调用accept之前调用。

原型:
int listen(SOCKET sockfd, int backlog);
参数:

sockfd:
socket系统调用返回的服务器端socket描述符

backlog:
backlog指定在请求队列中允许的最大请求数。

返回值:
4、连接(accept)
作用:

accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。

原型:
int accept (int sockfd, struct sockaddr *addr, socklen_t addrlen);	
参数:

sockfd:
socket系统调用返回的服务器端socket描述符

** addr:*
指向客户端数据结构sockaddr的指针,其中包括目的端口和IP地址

addrlen:
参数二sockaddr的长度,可以通过sizeof(struct sockaddr)获得

返回值:

该函数的返回值是一个新的套接字描述符连接成功后对数据的操作,使用的都是这个新的套接字描述符。
返回值是表示已连接的套接字描述符,而第一个参数是服务器监听接字描述行。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连套接字(表示TCP三次握手已完成,当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。

5、客户端的连接(connect)
作用:
原型:
int connect (int sockfd, struct sockaddr * addr, socklen_t addrlen);
参数:

**sockfd:**套接字描述符
** * addr:**指向数据结构sockaddr的指针,其中包括目的端口和IP地址
**addrlen:**参数二sockaddr的长度,可以通过sizeof(struct sockaddr)获得

返回值:

成功则返回0,失败返回非0,错误码GetLastError()。

6、UDP数据收发(待完善)
作用:
原型:
参数:
返回值:
7、TCP数据收发(第一套)
(1)发送
原型:
ssize_ t send(int s, const void *msg,size_t len,int flags);
参数:

s:
s为已建立好连接的套接字描述符

** msg:*
msg指向存放待发送数据的缓冲区

len:
len为待发送数据的长度

flags:
flags为控制选项,一般设置为0

(2)接收
原型:
ssize t recv(int s, void *buf,size_t len, int flags);
参数:

s:
s为已建立好连接的套接字描述符

** buf:*
buf指向存放待接收数据的缓冲区

len:
len为待接收收据的长度

flags:
flags为控制选项,一般设置为0

返回值:

函数返回读或写的字节个数,出错则返回-1

8、TCP数据收发(第二套)
(1)发送

将buf中的nbytes个字节写入到文件描述符fd中,成功时返回写的字节数。

原型:
ssize_t write(int fd, const void*buf,size_t nbytes);
参数:

fd:
fd为已建立好连接的文件描述符

** buf:*
buf指向存放待发送数据的缓冲区

size_t nbytes:
size_t nbytes为待发送数据的长度

(2)接收

从fd中读取nbyte个字节到buf中,返回实际所读的的字节数。

原型:
ssize_t read(int fd,void *buf,size_t nbyte);
参数:

fd:
fd为已建立好连接的文件描述符

** buf:*
buf指向存放待接收数据的缓冲区

size_t nbytes:
size_t nbytes为待接收数据的长度

返回值:

函数返回读或写的字节个数,出错则返回-1

其他的网络I/O还有一些函数如:recv() /send()、readv()/witev()、recvmsg()/sendnsg()、recvfrom()/sendto()
9、地址转化API:(待完善)

(1)字符串转网络

作用:

把字符串形式的”192.168.1.123"转为网络能识别的格式

原型:
int inet_aton(const char* straddr,struct in_addr *addrp);
参数:

*straddr:
*addrp:

(2)网络转字符串

作用:

把网络格式的ip地址转为字符串形式

原型:
char* inet ntoa(struct in_ addr inaddr);
参数:

inaddr:

返回值:
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值