您的位置:首页 > 理论基础 > 计算机网络

基本的TCP编程

2014-01-17 13:43 288 查看


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


family:
AF_INET ipv4协议
AF_INET6 ipv6协议
AF_LOCAL unix域协议
AF_ROUTE 路由套接口

type:
SOCK_STREAM 字节流套接口
SOCK_DGRAM 数据包套接口
SOCK_RAW 原始套接口

返回一个很小的非负整数,叫做套接口描述字,简称套接字sockfd

AF_XXX地址族
PF_XXX协议族

connect()建立一个TCP连接

三次握手出错:
1 发送无应答,6秒后再次发送,无应答,24秒后再次发送,若75秒钟后仍未相应,则返回错误
2 硬错:SYN返回RST:SYN到达端口,但没有监听进程、TCP想取消一个已有的连接、TCP接受了一个根本不存在的连接
3 软错:中间路由器产生目的地不可达的ICMP错误

bind() 给套接口分配一个本地协议地址

struct sockaddr_in servaddr;
servaddr.sin_addr.s_addr = htol(INADDR_ANY);


头文件<netinet/in.h>定义的所有INADDR_常值都是主机字节序,所以应该使用htol

捆绑非通配IP地址的好处是:由内核将给定的目的IP地址解复用后送往服务器进程

int listen(int sockfd,int backlog);


listen()仅被TCP服务器使用:在调用socket bind之后,accept之前
1 将未连接的套接口转换成被动套接口,指示内核应接受只想此套接口的连接请求。
2 函数第二个参数规定了,套接口排队的最大连接个数

对于给定的监听套接口,有两个队列:
1 未完成连接队列 incomplete connection queue SYN_RCVD状态
2 已完成连接队列 complete connection queue ESTABLISHED状态



accept() TCP服务器调用,从已完成的队列头返回下一个已完成的连接。若完成队列为空,则睡眠

int accept(int sockfd,struct sockaddr *cliaddr,socklen_t * addrlen);


addrlen是值-结果参数

fork()一次调用两个返回值:
1 父进程调用返回的是子进程的ID
2 子进程调用返回0

close()将套接口设置为已关闭标记,并立即返回到进程。

描述字访问计数,用于设置父进程的访问状况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: