在前两篇文章中,我们学习了如何创建套接字、绑定地址、监听连接以及接受连接。本文是第三篇,我们将重点介绍如何使用套接字进行数据的发送和接收。
一、数据传输
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套接字的数据传输。