在Linux系统中,处理网络连接通常涉及以下几个步骤:
创建套接字(Socket):
socket()
函数创建一个套接字。这个函数返回一个文件描述符,用于后续的网络操作。int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
配置套接字地址:
struct sockaddr_in
结构体来配置套接字的IP地址和端口号。struct sockaddr_in serv_addr;
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080); // 端口号
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); // IP地址
绑定套接字:
bind()
函数将套接字绑定到指定的IP地址和端口号。if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
监听连接:
listen()
函数监听传入的连接请求。if (listen(sockfd, 3) < 0) {
perror("listen failed");
close(sockfd);
exit(EXIT_FAILURE);
}
接受连接:
accept()
函数接受一个传入的连接请求。struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
perror("accept failed");
close(sockfd);
exit(EXIT_FAILURE);
}
数据传输:
read()
和write()
函数进行数据的读取和发送。char buffer[256];
ssize_t n = read(newsockfd, buffer, 255);
if (n < 0) {
perror("read failed");
close(newsockfd);
close(sockfd);
exit(EXIT_FAILURE);
}
buffer[n] = '\0';
printf("Here is the message: %s\n", buffer);
n = write(newsockfd, "I got your message", 18);
if (n < 0) {
perror("write failed");
close(newsockfd);
close(sockfd);
exit(EXIT_FAILURE);
}
关闭套接字:
close()
函数关闭套接字。close(newsockfd);
close(sockfd);
以下是一个简单的TCP服务器示例,它监听端口8080并处理客户端连接:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int sockfd, newsockfd;
struct sockaddr_in serv_addr, cli_addr;
socklen_t clilen;
char buffer[256];
// 创建套接字
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(8080);
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");
close(sockfd);
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(sockfd, 3) < 0) {
perror("listen failed");
close(sockfd);
exit(EXIT_FAILURE);
}
// 接受连接
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
perror("accept failed");
close(sockfd);
exit(EXIT_FAILURE);
}
// 数据传输
memset(buffer, '0', 256);
n = read(newsockfd, buffer, 255);
if (n < 0) {
perror("read failed");
close(newsockfd);
close(sockfd);
exit(EXIT_FAILURE);
}
buffer[n] = '\0';
printf("Here is the message: %s\n", buffer);
n = write(newsockfd, "I got your message", 18);
if (n < 0) {
perror("write failed");
close(newsockfd);
close(sockfd);
exit(EXIT_FAILURE);
}
// 关闭套接字
close(newsockfd);
close(sockfd);
return 0;
}
这个示例展示了如何在Linux系统中处理一个简单的TCP连接。实际应用中可能需要处理多个连接、使用多线程或多进程来提高并发处理能力。