06 网络1
06 网络1
socket
体系函数过程
三次握手
四次挥手
socket api
socket
-
int socket(int domain, int type, int protocol)
- 参数:
domain
: 通信域,例如AF_INET
表示IPv4type
: 套接字类型,例如SOCK_STREAM
表示TCPprotocol
: 协议,通常设为0,让系统选择默认协议
- 返回值:成功时返回套接字描述符,失败时返回-1
- 参数:
bind
-
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
- 参数:
sockfd
: 套接字描述符addr
: 指向sockaddr
结构的指针,包含服务器的地址信息addrlen
:sockaddr
结构的大小
- 返回值:成功时返回0,失败时返回-1
- 参数:
listen
-
int listen(int sockfd, int backlog)
- 参数:
sockfd
: 套接字描述符backlog
: 等待队列中的最大连接数
- 返回值:成功时返回0,失败时返回-1
- 参数:
accept
-
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
- 参数:
sockfd
: 套接字描述符addr
: 指向sockaddr
结构的指针,用于存储客户端的地址信息addrlen
: 指向sockaddr
结构大小的指针
- 返回值:成功时返回一个新的套接字描述符,用于与客户端通信,失败时返回-1
- 参数:
read
-
ssize_t read(int fd, void *buf, size_t count)
- 参数:
fd
: 套接字描述符buf
: 指向缓冲区的指针,用于存储读取的数据count
: 要读取的最大字节数
- 返回值:成功时返回实际读取的字节数,失败时返回-1
- 参数:
write
-
ssize_t write(int fd, const void *buf, size_t count)
- 参数:
fd
: 套接字描述符buf
: 指向要发送的数据的指针count
: 要发送的字节数
- 返回值:成功时返回实际发送的字节数,失败时返回-1
- 参数:
close
-
int close(int fd)
- 参数:
fd
: 套接字描述符
- 返回值:成功时返回0,失败时返回-1
- 参数:
在提供的代码片段中,使用了以下socket API,这些API在之前的回答中没有列出:
inet_pton
-
int inet_pton(int af, const char *src, void *dst)
- 参数:
af
: 地址族,例如AF_INET
表示IPv4src
: 要转换的地址字符串dst
: 指向存储转换结果的缓冲区的指针
- 返回值:成功时返回1,如果输入无效返回0,失败时返回-1
- 参数:
connect
-
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
- 参数:
sockfd
: 套接字描述符addr
: 指向sockaddr
结构的指针,包含服务器的地址信息addrlen
:sockaddr
结构的大小
- 返回值:成功时返回0,失败时返回-1
- 参数:
send
-
ssize_t send(int sockfd, const void *buf, size_t len, int flags)
- 参数:
sockfd
: 套接字描述符buf
: 指向要发送的数据的指针len
: 要发送的字节数flags
: 套接字选项标志
- 返回值:成功时返回实际发送的字节数,失败时返回-1
- 参数:
recv
-
ssize_t recv(int sockfd, void *buf, size_t len, int flags)
- 参数:
sockfd
: 套接字描述符buf
: 指向缓冲区的指针,用于存储接收的数据len
: 缓冲区的大小flags
: 套接字选项标志
- 返回值:成功时返回实际接收的字节数,连接关闭时返回0,失败时返回-1
- 参数:
socket example - echo server
服务器代码
|
客户端代码
下面是一个简单的C++客户端socket使用案例,该客户端连接到服务器,发送一条消息,并接收服务器的响应。
|
练习
-
socket写一个echo server以及一个client
-
file server:1024字节 - 分包粘包问题
- 客户端发送文件名
- 服务器查找文件是否存在
- 如果存在,把文件里的内容读出来,发给客户端
- 如果不存在,发送“文件不存在”
- 客户端接收信息
- 如果接收到文件,就存到本地
- 如果接收不到文件,接收到“文件不存在”,则在输出打印出来不存在,让用户重新输入文件名
-
在linux系统上使用CMakeLists.txt
apt install cmake g++ gdb -y |
运行重定向
./server >> log.txt |