linux C语言socket服务端循环监听端口
时间: 2023-08-06 16:05:47 浏览: 120
Linux下,通过socket监听指定端口的程序
4星 · 用户满意度95%
下面是一个简单的 Linux C 语言 socket 服务端循环监听端口的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888 // 监听端口号
int main()
{
int sockfd, connfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t len = sizeof(cliaddr);
char buffer[1024];
// 创建 socket 文件描述符
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 初始化服务器 socket 地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET; // 协议族
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // INADDR_ANY 表示任意地址
servaddr.sin_port = htons(PORT); // 端口号
// 绑定 socket 文件描述符和服务器 socket 地址
if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// 开始监听连接请求
if (listen(sockfd, 5) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d...\n", PORT);
while (1) {
// 接受客户端连接请求
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
if (connfd == -1) {
perror("accept");
continue;
}
printf("Accepted new connection from %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 读取客户端发来的数据
read(connfd, buffer, sizeof(buffer));
printf("Received message: %s\n", buffer);
// 回复客户端
write(connfd, "Hello, client!", strlen("Hello, client!"));
// 关闭客户端连接
close(connfd);
}
// 关闭服务器 socket
close(sockfd);
return 0;
}
```
这段代码创建了一个 TCP socket 文件描述符,通过 `bind()` 函数将其绑定到指定的端口号,然后通过 `listen()` 函数开始监听连接请求。在 `while` 循环中,通过 `accept()` 函数等待客户端连接请求,并在连接建立后读取客户端发送的数据并回复。循环不断接受新的连接请求,直到服务器关闭。
阅读全文