在Linux系统中,进程之间的网络通信通常通过套接字(socket)来实现。套接字是一种通信端点,允许不同进程通过网络进行数据交换。以下是Linux进程中网络连接建立与维护的基本方法:
创建套接字
socket()
函数创建一个套接字。int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
配置地址和端口
struct sockaddr_in
结构体来配置服务器地址和端口。struct sockaddr_in serv_addr;
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
绑定套接字
bind()
函数将套接字绑定到指定的地址和端口。if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
监听连接
listen()
函数开始监听传入连接。if (listen(sockfd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
接受连接
accept()
函数接受一个传入连接。int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
数据传输
send()
和recv()
函数进行数据的发送和接收。char buffer[1024];
int n = recv(newsockfd, buffer, sizeof(buffer), 0);
if (n < 0) {
perror("recv failed");
exit(EXIT_FAILURE);
}
printf("Received message: %s\n", buffer);
n = send(newsockfd, "Hello, client!", 14, 0);
if (n < 0) {
perror("send failed");
exit(EXIT_FAILURE);
}
关闭连接
close()
函数关闭套接字。close(newsockfd);
close(sockfd);
在网络编程中,错误处理是非常重要的。常用的错误处理方法包括:
perror()
函数打印错误信息。以下是一个简单的TCP服务器示例,展示了如何建立和维护连接:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd, newsockfd;
struct sockaddr_in serv_addr, cli_addr;
socklen_t clilen;
char buffer[1024];
// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 配置地址和端口
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
// 绑定套接字
if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(sockfd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受连接
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 数据传输
int n = recv(newsockfd, buffer, sizeof(buffer), 0);
if (n < 0) {
perror("recv failed");
exit(EXIT_FAILURE);
}
printf("Received message: %s\n", buffer);
n = send(newsockfd, "Hello, client!", 14, 0);
if (n < 0) {
perror("send failed");
exit(EXIT_FAILURE);
}
// 关闭连接
close(newsockfd);
close(sockfd);
return 0;
}
这个示例展示了如何创建一个简单的TCP服务器,接受客户端连接,并进行基本的数据交换。实际应用中可能需要处理更多的错误情况和并发连接。
辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
推荐阅读: linux怎么设置redis开机自启动