linux socket只执行listen不执行accept
当你在Linux上使用socket编程时,调用listen函数将socket设置为监听状态,等待连接请求。但是,只调用listen函数是不会执行accept操作的。
accept操作是在有连接请求到达时,通过调用accept函数来接受连接,并创建一个新的socket来处理该连接。因此,如果你只调用listen函数而不调用accept函数,那么你的程序将一直处于监听状态,但不会处理任何连接请求。
要处理连接请求,你需要在调用listen函数后,使用accept函数来接受连接。一般的做法是将accept函数放在一个循环中,以便能够接受多个连接请求。
以下是一个简单的示例代码,演示了如何使用socket编程在Linux上监听连接请求并接受连接:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error opening socket");
exit(1);
}
// 设置服务器地址
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 1234;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
// 绑定socket
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("Error on binding");
exit(1);
}
// 监听连接请求
listen(sockfd, 5);
// 接受连接请求并处理连接
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
perror("Error on accept");
exit(1);
}
// 处理连接
bzero(buffer, 256);
n = read(newsockfd, buffer, 255);
if (n < 0) {
perror("Error reading from socket");
exit(1);
}
printf("Message from client: %s\n", buffer);
// 关闭socket
close(newsockfd);
close(sockfd);
return 0;
}
在上述示例中,我们创建了一个socket,设置服务器地址,绑定socket,并调用listen函数开始监听连接请求。然后,我们使用accept函数来接受连接请求并创建一个新的socket来处理连接。在处理连接时,我们读取客户端发送的消息并打印出来。最后,我们关闭连接的socket。
请注意,这只是一个简单的示例代码,没有处理多个连接请求或错误处理。在实际的应用中,你可能需要使用多线程或多进程来处理多个连接请求,并进行适当的错误处理。
原文地址: https://www.cveoy.top/t/topic/iLg9 著作权归作者所有。请勿转载和采集!