C言语作为一种历史长久且功能富强的编程言语,在收集编程范畴有着广泛的利用。TCP连接是收集编程中弗成或缺的一部分,它确保了数据传输的坚固性跟次序性。本文将带领读者从C言语的角度入门TCP连接编程,并深刻懂得其中的核心技能。
TCP(传输把持协定)是一种面向连接的、坚固的、基于字节省的传输层通信协定。它供给了一种机制,确保数据包按次序、无错误地从发送方传输到接收方。
TCP连接的树破过程平日称为三次握手,它包含以下步调:
在C言语中停止TCP编程时,须要包含以下头文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
利用socket()
函数创建一个套接字,指定通信域(如AF_INET表示IPv4)、套接字范例(如SOCK_STREAM表示TCP)跟协定范例(平日为0,表示默许协定)。
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
创建一个struct sockaddr_in
构造体,并设置其中的成员变量,包含地点跟端口号。
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8080);
server_address.sin_addr.s_addr = INADDR_ANY;
利用bind()
函数将套接字绑定到指定的地点跟端口上。
bind(sockfd, (struct sockaddr *)&server_address, sizeof(server_address));
利用listen()
函数开端监听连接恳求。
listen(sockfd, 5);
利用accept()
函数接收客户端的连接恳求。
struct sockaddr_in client_address;
int client_socket = accept(sockfd, (struct sockaddr *)&client_address, sizeof(client_address));
利用send()
跟recv()
函数发送跟接收数据。
char buffer[1024];
int bytes_read = recv(client_socket, buffer, sizeof(buffer), 0);
if (bytes_read > 0) {
send(client_socket, buffer, bytes_read, 0);
}
在通信结束后,利用close()
函数封闭套接字,开释资本。
close(client_socket);
close(sockfd);
以下是一个简单的C言语TCP效劳器端跟客户端实例:
// 效劳器端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int serverfd, newsocket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
// 创建socket文件描述符
if ((serverfd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 强迫绑定到端口8080
if (setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
// 绑定socket到端口8080
if (bind(serverfd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接恳求
if (listen(serverfd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接收连接
newsocket = accept(serverfd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
if (newsocket < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 通信
char buffer[1024] = {0};
int valread = read(newsocket, buffer, 1024);
if (valread > 0) {
printf("%s\n", buffer);
}
// 封闭连接
close(newsocket);
close(serverfd);
return 0;
}
经由过程本文的介绍,读者应当对C言语TCP连接编程有了基本的懂得。控制TCP连接编程的核心技能对收集编程至关重要,盼望本文能帮助读者在将来的收集编程现实中获得更好的成果。