赞
踩
int socket(int domain, int type, int protocol);
1.domain:
指明所使用的协议族,通常为 AF_INET ,表示互联网协议族(TCP / IP 协议族);
AF_INET IPv4 因特网域
AF_INET6 IPv6 因特网域
AF_UNIX Unix 域
AF_ROUTE 路由套接字
AF_KEY 密钥套接字
AF_UNSPEC 未指定
2.type参数指定socket的类型:
SOCK_STREAM :
流式套接字提供可靠的,面向连接的通信流,它使用 TCP 协议,从而保证了数据传输的正确性和顺序性
SOCK_DGRAM
数据报套接字定义了一种无连接的符服,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠的、无差错的。它使用数据报协议 UDP。
SOCK_RAW
允许程序使用低层协议,原始套接字允许对底层协议如 IP 或 ICMP 进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。
3.protocol
通常赋值为 “0”。
0 选则 type 类型对应的默认协议
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP传输协议
IPPROTO_SCTP SCTP传输协议
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:是一个 socket 描述符
addr(结构体指针):是一个指向包含本机 IP 地址及端口号等信息的 sockaddr 类型的指针,指向要绑定给 sockfd 的协议地址结构,这个地址结构根据地址创建 socket 时的地址协议族不同而不同
IPV4 对应的是:
struct sockaddr {
sa_family_t sa_family; //协议族
char sa_data[14]; //IP+端口
}
同等替换(用的多):
struct sockaddr_in {
sa_family_t sin_family; /*协议族*/
in_port sin_port; /*端口号*/
struct in_addr sin_addr; /*IP地址结构体*/
unsigned char sin_zero[8] /*填充 没有实际意义,只是为跟 sockaddr 结构在内存中对齐,这样两者才能互相转换*/
int inet_aton(const char *straddr, struct in_addr *addrp);
把字符串形式的"1921.168.1.123"转为网络能识别的格式
char *inet_ntoa(struct in_addr inaddr;
把网络格式的 IP 地址转为字符串形式。
int listen(int sockfd, int backlog);
1.功能
设置能处理的最大连接数,llisten( ) 并未开始接受连线,只是设置socket 的 listen 模式,listen 函数只用于服务器端,服务器进程不知道要与谁连接,因此,它不会主动地要求与某个进程连接,然后响应该连接请求,并对它做出处理,一个服务进程可以同时同时处理多个客户进程的连接。主要就两个功能:将一个未连接的套接字转换为一个被套接字(监听),规定内核为相应套接字排队的最大连接数。
内核为任何一个给定监听套接字维护两个队列:
未完成连接队列,每个这样的 SYN 报文段对应其中一项:已由某个客户端发出并到达服务器,而服务器正在等待完成相应的 TCP 三次握手过程。这些套接字处于 SYN_REVD 状态。
已完成连接队列,每个已完成 TCP 三次握手过程的客户端对应其中一项。这些套接字处于 ESTABLISHED 状态。
2.参数
sockfd
sockfd 是 socket 系统调用返回的服务器端 socket 描述符
backlog
backlog 指定在请求队列中允许的最大请求数(监听几个)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
如果成功,这些系统调用将返回一个非负整数,它是所接受的套接字的描述符。如果出现错误,则返回-1,并适当设置errno。
功能:
accept 函数由 TCP 服务器调用,用于从已完成连接队列列头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。
参数:
sockfd
sockfd 是 socket 系统调用返回的服务器 socket 描述符
addr
用来返回已连接的对端(客户端)的协议地址
addrled
客户端地址长度
返回值:
该函数的返回值是一个新的套接字描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。一个服务器通常仅仅床架一个监听套接字,它在该服务器的声明周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字(表示 TCP 三次握手已完成),放服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。
在套接字 通信中进行字节读取函数:read( ),write( )。与 I/O 中的读取函数略有区别,因为它们输入或输出的字节数比可能比请求的少。
ssize_t write(int fd, const void *buf, size_t nbytes);
ssize_t read(int fd, void *buf, size_t nbytes);
说明:
函数均返回读或写的字节个数,出错则返回 -1
第一个将 buf 中的 nbytes 个字节写入到文件描述符 fd 中,成功时返回写的字节数。第二个为从 fd 中读取 nbytes 个字节到 buf 中,则返回实际所读的字节数。详细应用说明参考使用 read write 读写 socket (套接字)。
网络 I/O还有一些函数,例如: recv()/send() ,readc()/write(),recvmsg()/sendmsg(),recvfrom()/sendti() 等
1.在 TCP 套接字上发送数据函数:有连接
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
包含2要素:套接字sockfd,待发数据 buf,数据长度 len
函数只能对处于连接状态的套接字使用,参数 sockfd 为已建立好连接的套接字描述符,即是accpet函数的返回值
参数 buf 指向存放待发送数据的缓冲区
参数 len 为待发送数据的长度,参数flags 为控制选项,一般设置为 0 ;
2.在 TCP 套接字上接收数据函数:有连接
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
包含2要素:套接字sockfd,待发数据 buf,数据长度 len
函数 recv 从参数 sockfd 所指定的套接字描述符(必须是面向连接的套接字)上接收
数据并保存到参数 buf 所指定的缓冲区
参数 len 则为缓冲区长度,参数 flags 为控制选项,一般设置为 0 ;
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:
该函数用于绑定之后的 client 端(客户端),与服务器建立连接
参数:
sockfd
是目的服务器的sockect 描述符
addr
是服务器端的 IP 地址和端口号的地址结构指针
addrlen
地址长度常被设置为 sizeof(struct sockaddr)
返回值:
成功返回0,遇到错误时返回 -1 ,并且errno 中包含相应的错误码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。