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: