基本TCP套接字编程的一些函数详解

套接字是为了区别不同的应用程序和连接的.

1.socket函数

#include<sys/socket.h>

int socket(int family,int type,int protocol);//成功则为非负描述符,出错则为-1

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传输协议),若设置为0表示选择所给定family和type组合的系统默认值。


注意:TCP是字节流协议,仅支持字节流套接字(SOCK_STREAM)


2.connect函数:TCP套接字调用connect函数时将激发TCP的三路握手过程,仅在连接建立成功或出错时才返回。

#include<sys/socket.h>

int connect(int sockfd,const struct sockaddr * servaddr,socklen_t addrlen);

sockfd:返回的套接字描述符

servaddr:指向套接字地址的指针(包含服务器的IP地址和端口号)

addrlen:该地址结构的大小。

(1)若TCP客户没有收到SYN分节的相应,则返回ETIMEDOUT错误

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

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

(3)若客户发出的SYN在和总监的某个路由器上引发目的地不可达的ICMP错误,则认为是一种软错误。(作为EHOSTUNREACH或ENETUNREACH错误返回给进程)


3.bind函数:把一个本地协议地址赋予一个套接字。

#include<sys/socket.h>

int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);

服务器在启动时捆绑它们的总所周知的端口,如果一个服务器为曾调用bind捆绑一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时端口。


4.listen函数:仅仅由TCP服务器调用,在socket函数创建一个套接字时,它被假设为一个主动套接字,是一个将调用connect发起连接的客户套接字,listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求(导致从closed状态转换成listen状态)

#include<sys/socket.h>

int listen(int sockfd,int backlog)

backlog:表示内核应该为相应套接字排队的最大连接个数。本函数通常在accept之前调用。

(注意内核为任何一个给定的监听套接字维护两个队列:

未完成连接队列:每个这SYN分节对应其中一项,他们处于SYN_RCVD状态

已完成连接队列:每个完成TCP三路握手过程的客户对应其中一项。这些套接字处于ESTABLISHED状态。


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

#include<sys/socket.h>

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

sockfd:是一个监听套接字,与已连接套接字是不同的

cliaddr:用来返回已连接的对端进程(客户)的协议地址。


如果accept成功,其返回值可能有三个参数:一个是是由内核自动生成的一个全新描述符,是一个已连接描述符,还有客户进程的协议地址以及该地址的大小,代表与所返回客户的TCP连接。


6.fork函数:返回两次,返回值为0的是子进程,因为任何子进程的父进程只有一个,返回值为新派生(子进程)的进程id号,这样父进程就能够获得该子进程的进程id

exec函数:exec是Unix能够执行存放在硬盘上的可执行程序的唯一方法。它把当前进程映像替换成新的程序文件,而且该程序通常从main函数开始执行。进程ID并不改变,我们称调用exec的进程为调用进程,称新执行的程序为新程序


7.close函数:用来关闭套接字,并终止TCP连接。

#include<unist.h>

int close(int sockfd);成功返回0,不成功,返回1

close首先把该套接字标记成已关闭,然后立即返回到调用进程,也就是read或write不能再id哦啊用,TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TCP连接终止序列。


8.read函数:从打开文件中读数据

#include<unistd.h>

ssize_t read(int filedes,void *buf,size_t nbytes);//若成功则返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1

例如:read(STDIN_FILENO,buf,BUFFSIZE);//从标准输入描述符中读入BUFFSIZE字节到buff流中。


9.write函数:向打开的文件写数据

#include<unistd.h>

ssize_t write(int filedes,const void *buf,size_t nbytes);//若成功则返回已写的字节数,若出错则返回-1

例如:write(STDOUT_FILENO,buf,n);将buff中的n个字节写入标准输出描述符中。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值