socket函数
为了执行网络IO,一个程序首先要做的就是调用socket函数,指定期望的通信协议(使用IPv4的TCP、使用IPv6的UDP、UNIX字节域协议等):
#include <sys/socket.h>
int socket(int family,int type,int protocol);
--若成功返回非负描述符,失败返回-1
family type protocol可取的值如下,另外protocol可以设为0。
family | 协议簇 |
---|---|
AF_INET | IPv4协议 |
AF_INET6 | IPv6协议 |
AF_LOCAL | UNIX域协议 |
AF_ROUTE | 路由套接字 |
AF_key | 密钥套接字 |
type | 套接字类型 |
---|---|
SOCK_STREAM | 字节流套接字 |
SOCK_DGRAM | 数据报套接字 |
SOCK_SEQPACKET | 有序分组套接字 |
SOCK_RAW | 原始套接字 |
protocol | 协议类型常值 |
---|---|
IPPROTO_TCP | TCP传输协议 |
IPPROTO_UDP | UDP传输协议 |
IPPROTO_SCTP | SCTP传输协议 |
- 注意:family和type的组合可以确定协议类型。
- 比如:
- SOCK_STREAM+AF_INET/AF_INET6 —–>TCP/SCTP
- SOCK_DGRAM+AF_INET/AF_INET6 ——->UDP
- SOCK_SEQPACKET+AF_* ———>SCTP
connect函数:
TCP客户端用connect函数来建立与TCP服务器的连接
#include <sys/socket.h>
int connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);
----成功返回,失败返回-1
sockfd是socket函数返回的套接字描述符,第二个第三个分别是一个指向套接字地址结构的指针和地址结构的大小。
如果是TCP连接,调用conncet将会激发TCP的三路握手过程,而且仅在成功或者出错时返回。出错返回有以下两种:
- TCP客户没有受到SYN分节的响应,则返回ETIMEOUT的错误
- 若对客户SYN的回应是RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待与之连接。
若客户发出的SYN在某个路由器上引发了一个”destination unreachable”ICMP错误,则认为是一种软错误。
bind函数
bind函数把一个本地协议地址赋予一个套接字。
#include <sys/socket.h>
int bind(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);
----成功返回0,失败返回-1