基本的tcp套接口编程

基本的tcp套接口编程

1.socket函数

为了执行网络I/O,一个进程必须做的第一件事情是调用socket函数,指定期望的通信协议类型。

#include <sys/socket.h>
int socket(int family, int type, int protocol);
//返回:非负描述字代表成功,-1代表出错。

socket函数的协议族(family)常值
family说明
AF_INETIPv4协议
AF_INET6IPv6协议
AF_LOCALunix域协议
AF_ROUTE路由套接口
AF_KEY密钥套接口
套接口类型(type)常值
type说明
SOCK_STREAM字节流套接口
SOCK_DGRAM数据流套接口
SOCK_SEQPACKET有序分组套接口
SOCK_RAW原始套接口
  
socket函数AF_INET或AF_INE6的协议类型常值

protocol说明
IPPROTO_TCPtcp传输协议
IPPROTO_UDPudp传输协议
IPPROTO_SCTPsctp传输协议

2.connect函数

tcp客户用connect函数建立与tcp服务器的连接。

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
//返回:0代表成功,-1代表出错
如果是tcp套接口出错返回的情况有3种:

1).若tcp客户没有收到SYN分节的响应,则返回ETIMEOUT错误。

2).若对客户的SYN的响应是RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待与之连接。这是一种硬错(hard error),客户一接受到RST就马上返回ECONNEREFUSED错误。

产生RST的三个条件是:目的地为某端口的SYN到达;在该端口上没有正在监听的服务器;tcp想取消一个已有的连接;tcp接受到一个根本不存在的连接上的分节。

3).若客户发出的SYN在中间的某个路由器上引发了一个"destination unreachable"的ICMP错误,则认为是一种软错(soft error).以下两种也是可能的:一是按照本地系统的转发表,根本没有到达远地系统的路径;二是connect调用根本不等待就返回。

3.bind函数

bind函数把一个本地协议地址赋予一个套接口。

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addr_len);
//返回:0代表成功,-1代表出错

对于tcp来说,调用bind函数可以指定一个端口号,指定一个IP地址,可以两者都指定,也可以都不指定。

ip地址端口结果
通配地址0内核选择ip地址和端口
通配地址非0内核选择ip地址,进程指定端口
本地ip地址0进程指定ip地址,内核选择端口
本地ip地址非0进程指定ip地址和端口

对于ipv4来说,通配地址由常值INADDR_ANY来指定,其值一般为0.

4.listen函数

listen函数仅由tcp服务器调用,它做两件事情:

1).listen函数把一个未连接的套接口转换为一个被动套接口,指示内核应接受指向该套接口的连接请求。调用listen导致套接口从CLOSED状态转换为LISTEN状态。

2).第二个参数规定了内核应该为相应套接口排队的最大连接数。

#include <sys/socket.h>
int listen(int sockfd, int backlog);
//返回:0代表成功,-1代表出错

5.accept函数

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

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
//返回:非负描述字代表成功,-1代表出错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值