socket 结构
imagesocket
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- domain:
填地址族AF_INET
,AF_INET6
,AF_UNIX
- type:
SOCK_STREAM
: 使用面向连接的流传输协议
SOCK_DGRAM
: 使用无连接的数据报协议 - protocol:
0
: 默认协议,流传输默认tcp
,数据报默认udp
- retrurn
成功返回一个新的套接字sockfd
,失败返回-1
并设置errno
bind 给本地套接字赋予地址和端口
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd:
sock套接字 - addr:
sockaddr
结构体,强转sockaddr_in
或sockaddr_in6
- addrlen:
addr结构体实际大小 - return:
成功返回0
,失败返回-1
, 设置errno
listen 开始监听
#include <sys/socket.h>
int listen(int sockfd, int backlog);
- sockfd:
参数为成功调用socket
函数返回的套接字,并已经成功调用了bind()
。 - backlog:
参数告诉套接字在忙于处理上一个请求时,还可以接受多少个进入的请求。 - retrun:
调用成功返回0
,失败返回-1
,设置errno
。 - 查看系统默认backlog
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
accept 接受网络连接
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- sockfd:
参数为成功调用socket
函数返回的套接字,并已经成功调用了bind()
和listen()
- addr:
传出参数,返回连接客户端地址信息,含IP
地址和端口
号。(如果使用IPv4
地址族,那么它需要我们填个指向sockaddr_in
结构的指针) - addrlen:
传入传出参数,传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小 - return:
成功返回一个新的socket
文件描述符,用于和客户端通信,失败返回-1
,设置errno
connect 连接远程主机
请求连接是客户端的动作,TCP/IP
客户端需要调用connect()
去连接一个服务器:
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd:
参数是成功调用socket()
返回的套接字。 - addr:
传入参数,指定服务器端地址信息,含IP地址和端口号 - addrlen:
传入参数,如IPV4
传入sizeof(struct sockaddr_in)
大小 - return
如果调用成功,表示连接已经建立(三次握手完成),返回0
。否则返回 -1
,设置errno
socket I/O
对于套接字的I/O有很多API可以用,如send()
、recv()
、readv()
、writev()
、sendmsg()
、recvmsg()
、read()
、write()
等等。只介绍常用的I/O接口read()
和write()
。
#include <unistd.h>
int read(int sockfs, void *buf, size_t nbytes);
int write(int sockfd, void *buf, size_t nbytes);
关闭套接字
#include <unistd.h>
int close(int sockfd);
调用close()会触发四次握手关闭连接。
实例
待补充。。。
网友评论