UDP(User Datagram Protocol)和 TCP(Transmission Control Protocol)是两种不同的传输层协议,它们在数据传输的可靠性、连接性、数据传输方式等方面有显著的区别。
TCP 是面向连接的协议,因此需要先建立连接。以下是一个简单的 TCP 服务器和客户端的示例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addr_len = sizeof(address);
char buffer[1024] = {0};
// 创建服务器 socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定地址和端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听端口
if (listen(server_fd, 3) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
// 接受客户端连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addr_len)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
// 接收数据
read(new_socket, buffer, 1024);
printf("Received message: %s\n", buffer);
// 发送响应
send(new_socket, "Hello from server", strlen("Hello from server"), 0);
printf("Response sent\n");
close(new_socket);
close(server_fd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sock = 0;
struct sockaddr_in server_address;
char *message = "Hello from client";
char buffer[1024] = {0};
// 创建 socket
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Socket creation error");
exit(EXIT_FAILURE);
}
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
// 转换 IPv4 地址
if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
perror("Invalid address");
exit(EXIT_FAILURE);
}
// 连接服务器
if (connect(sock, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Connection failed");
exit(EXIT_FAILURE);
}
// 发送消息
send(sock, message, strlen(message), 0);
printf("Message sent\n");
// 接收响应
read(sock, buffer, 1024);
printf("Received from server: %s\n", buffer);
close(sock);
return 0;
}
UDP 是无连接的协议,因此不需要建立连接。以下是一个简单的 UDP 服务器和客户端的示例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAXLINE 1024
int main() {
int sockfd;
char buffer[MAXLINE];
struct sockaddr_in server_address, client_address;
socklen_t len;
ssize_t n;
// 创建 UDP socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT);
// 绑定地址和端口
if (bind(sockfd, (const struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
len = sizeof(client_address);
n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *)&client_address, &len);
buffer[n] = '\0';
printf("Client message: %s\n", buffer);
sendto(sockfd, "Hello from server", strlen("Hello from server"), MSG_CONFIRM, (const struct sockaddr *)&client_address, len);
printf("Response sent\n");
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAXLINE 1024
int main() {
int sockfd;
char *message = "Hello from client";
char buffer[MAXLINE];
struct sockaddr_in server_address;
// 创建 UDP socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
// 转换 IPv4 地址
if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
perror("Invalid address");
exit(EXIT_FAILURE);
}
// 发送消息
sendto(sockfd, message, strlen(message), MSG_CONFIRM, (const struct sockaddr *)&server_address, sizeof(server_address));
printf("Message sent\n");
// 接收响应
ssize_t n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, NULL, NULL);
buffer[n] = '\0';
printf("Received from server: %s\n", buffer);
close(sockfd);
return 0;
}
connect()
和 accept()
建立连接。sendto()
和 recvfrom()
。read()
或 recv()
接收的数据来自已连接的套接字。recvfrom()
接收的数据来自任何发送方,不需要建立连接。