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 |