在前两篇文章中,我们学习了如何创建套接字、绑定地址、监听连接以及接受连接。本文是第三篇,我们将重点介绍如何使用套接字进行数据的发送和接收。
一、数据传输
1. send()和recv()函数
send()和recv()函数是网络编程中最常用的函数,用于发送和接收数据。
send()函数
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- sockfd:套接字文件描述符。
- buf:指向要发送的数据缓冲区的指针。
- len:要发送的数据长度。
- flags:发送标志,通常设置为0。
返回值:成功时返回实际发送的字节数,失败时返回-1。
recv()函数
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
- sockfd:套接字文件描述符。
- buf:接收数据的缓冲区。
- len:缓冲区长度。
- flags:接收标志,通常设置为0。
返回值:成功时返回实际接收的字节数,失败时返回-1。
示例
// 发送数据
if (send(client_sock, "Hello, client!", strlen("Hello, client!"), 0) == -1) {
perror("send failed");
exit(EXIT_FAILURE);
}
// 接收数据
char buffer[1024];
if (recv(client_sock, buffer, sizeof(buffer), 0) == -1) {
perror("recv failed");
exit(EXIT_FAILURE);
}
printf("Received: %s\n", buffer);
2. sendto()和recvfrom()函数
sendto()和recvfrom()函数用于发送和接收UDP数据。
sendto()函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
- sockfd:套接字文件描述符。
- buf:指向要发送的数据缓冲区的指针。
- len:要发送的数据长度。
- flags:发送标志,通常设置为0。
- dest_addr:指向目标地址的sockaddr结构。
- addrlen:地址结构的长度。
recvfrom()函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
- sockfd:套接字文件描述符。
- buf:接收数据的缓冲区。
- len:缓冲区长度。
- flags:接收标志,通常设置为0。
- src_addr:指向源地址的sockaddr结构。
- addrlen:指向sockaddr结构长度的指针。
二、关闭套接字
1. close()函数
close()函数用于关闭套接字,释放相关的资源。
int close(int fd);
- fd:套接字文件描述符。
返回值:成功时返回0,失败时返回-1。
示例
// 关闭套接字
if (close(client_sock) == -1) {
perror("close failed");
exit(EXIT_FAILURE);
}
三、总结
本篇文章介绍了如何使用send()和recv()函数进行TCP套接字的数据传输,以及如何使用sendto()和recvfrom()函数进行UDP套接字的数据传输。