本文共 5456 字,大约阅读时间需要 18 分钟。
TCP和UDP是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。它们在数据传输时分别采用了不同的方式,适用于不同的应用场景。
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的协议,提供可靠的全双工字节流传输。TCP的特点包括:
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,数据包的传输不依赖于是否建立连接。其特点包括:
特性 | TCP | UDP |
---|---|---|
连接性 | 建立连接(三次握手) | 无连接 |
可靠性 | 保障数据可靠传输 | 不保证数据可靠传输 |
数据传输方式 | 字节流传输 | 数据报传输 |
应用场景 | 适用于可靠性要求高的场景 | 适用于实时性要求高的场景 |
#include#include #include #include #include #include #include #include #define PORT 2345#define DSET_IP_ADDRESS "192.168.218.141"int main(int argc, char *argv) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd == -1) { perror("socket error"); return EXIT_FAILURE; } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { perror("connect error."); return EXIT_FAILURE; } do { printf("Please input char: "); fgets(buffer, 1024, stdin); write(sockfd, buffer, strlen(buffer)); } while (strncmp(buffer, "quit", 4) != 0); close(sockfd); return EXIT_SUCCESS;}
#include#include #include #include #include #include #include #include #define DEST_PORT 3000#define DSET_IP_ADDRESS "192.168.1.103"int main(int argc, char *argv) { int sock_fd; int send_num; int recv_num; int dest_len; char send_buf[20] = "hello tiger"; char recv_buf[20]; struct sockaddr_in addr_serv; struct sockaddr_in addr_client; sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if (sock_fd < 0) { perror("socket"); return 1; } memset(&addr_serv, 0, sizeof(addr_serv)); addr_serv.sin_family = AF_INET; addr_serv.sin_port = htons(DEST_PORT); addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); dest_len = sizeof(struct sockaddr_in); if (bind(sock_fd, (struct sockaddr *)&addr_serv, sizeof(struct sockaddr_in)) < 0) { perror("bind"); return 1; } while (1) { printf("begin recv:\n"); recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_client, &dest_len); if (recv_num < 0) { perror("again recvfrom"); return 1; } else { recv_buf[recv_num] = '\0'; printf("recv success: %s\n", recv_buf); } printf("begin send:\n"); send_num = sendto(sock_fd, recv_buf, recv_num, 0, (struct sockaddr *)&addr_client, dest_len); if (send_num < 0) { perror("sendto"); return 1; } else { printf("send success\n"); } } close(sock_fd); return 0;}
#include#include #include #include #include #include #include #include #define PORT 2345#define DSET_IP_ADDRESS "192.168.218.141"int main(int argc, char *argv) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd == -1) { perror("socket error"); return EXIT_FAILURE; } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { perror("connect error."); return EXIT_FAILURE; } do { printf("Please input char:\n"); fgets(buffer, 1024, stdin); write(sockfd, buffer, strlen(buffer)); } while (strncmp(buffer, "quit", 4) != 0); close(sockfd); return EXIT_SUCCESS;}
#include#include #include #include #include #include #include #include #define SERV_PORT 3000int main(int argc, char *argv) { int sock_fd; int recv_num; int send_num; int client_len; char recv_buf[20]; struct sockaddr_in addr_serv; struct sockaddr_in addr_client; sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if (sock_fd < 0) { perror("socket"); return 1; } memset(&addr_serv, 0, sizeof(addr_serv)); addr_serv.sin_family = AF_INET; addr_serv.sin_port = htons(SERV_PORT); addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); client_len = sizeof(struct sockaddr_in); if (bind(sock_fd, (struct sockaddr *)&addr_serv, sizeof(struct sockaddr_in)) < 0) { perror("bind"); return 1; } while (1) { printf("begin recv:\n"); recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_client, &client_len); if (recv_num < 0) { printf("bad\n"); perror("again recvfrom"); return 1; } else { recv_buf[recv_num] = '\0'; printf("recv success: %s\n", recv_buf); } printf("begin send:\n"); send_num = sendto(sock_fd, recv_buf, recv_num, 0, (struct sockaddr *)&addr_client, client_len); if (send_num < 0) { perror("sendto"); return 1; } else { printf("send success\n"); } } close(sock_fd); return 0;}
TCP和UDP分别适用于不同的应用场景。TCP提供可靠、有序的数据传输,适合连接性要求高的场景;UDP则适合实时性要求高、对连接性要求不高的场景。选择哪种协议取决于具体的应用需求。
转载地址:http://nmkfk.baihongyu.com/