c 端口侦听器客户端在收到 1 条消息后断开连接
c port listener client disconnects after 1 message
我确实创建了一个侦听端口并在终端上打印消息的程序。
我的问题是,我想通过 telnet (telnet localhost 1337) 连接到我的服务器,它工作正常。然后我在端口上监听,它也工作正常,但循环没有执行,我确实从我的 telnet 收到这条消息:
┌──(sourcecodeengineer㉿kali)-[~]
└─$ telnet localhost 1337 1 ⨯
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
a
Connection closed by foreign host.
我想在端口上监听,但我确实收到了一条我也实现了的“/shutdown”消息。
这将是我这次尝试的代码:
#include <stdio.h> // perror, printf
#include <stdlib.h> // exit, atoi
#include <unistd.h> // read, write, close
#include <arpa/inet.h> // sockaddr_in, AF_INET, SOCK_STREAM, INADDR_ANY, socket etc...
#include <string.h> // memset, strcmp
// server program, client program can be found at my Github Repo
int main(int argc, char const *argv[])
{
int serverFd, clientFd;
struct sockaddr_in server, client;
socklen_t len;
// default port if no port is given to listen on!
int port = 1337;
// buffer
char buffer[BUFSIZ];
if (argc == 2)
{
port = atoi(argv[1]);
}
serverFd = socket(AF_INET, SOCK_STREAM, 0);
if (serverFd < 0)
{
perror("Cannot create socket");
exit(1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
len = sizeof(server);
if (bind(serverFd, (struct sockaddr *)&server, len) < 0)
{
perror("Cannot bind socket");
exit(2);
}
if (listen(serverFd, 10) < 0)
{
perror("Listen error");
exit(3);
} else {
printf("Listening on port %d.\n", port);
}
while (1)
{
len = sizeof(client);
if ((clientFd = accept(serverFd, (struct sockaddr *)&client, &len)) < 0)
{
perror("accept error");
exit(4);
}
memset(buffer, 0, sizeof(buffer));
int size = read(clientFd, buffer, sizeof(buffer));
if (size < 0)
{
perror("read error");
exit(5);
}
if (strcmp(buffer, "/shutdown")){
printf("Shutting down\n");
close(clientFd);
break;
} else {
printf("Echo: %s\n", buffer);
}
}
close(serverFd);
return EXIT_SUCCESS;
}
有没有一个很好的方法来实现一个行为,这样当更多的客户端连接到我的端口时,我一次只接受其中的一个并等待它们断开连接(telnet -> (CTRL+5 ))?
问题是
if (strcmp(buffer, "/shutdown"))
如果缓冲区 不 等于“/shutdown”,则 为真,因此您的侦听器在第一次读取后终止。
因为 strcmp()
在我看来 return 不是一个布尔值,所以永远不要写
if (strcmp(...))
或
if (!strcmp( ... ))
但是 - 在你的情况下 -
if (strcmp( ... ) == 0)
我确实创建了一个侦听端口并在终端上打印消息的程序。
我的问题是,我想通过 telnet (telnet localhost 1337) 连接到我的服务器,它工作正常。然后我在端口上监听,它也工作正常,但循环没有执行,我确实从我的 telnet 收到这条消息:
┌──(sourcecodeengineer㉿kali)-[~]
└─$ telnet localhost 1337 1 ⨯
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
a
Connection closed by foreign host.
我想在端口上监听,但我确实收到了一条我也实现了的“/shutdown”消息。
这将是我这次尝试的代码:
#include <stdio.h> // perror, printf
#include <stdlib.h> // exit, atoi
#include <unistd.h> // read, write, close
#include <arpa/inet.h> // sockaddr_in, AF_INET, SOCK_STREAM, INADDR_ANY, socket etc...
#include <string.h> // memset, strcmp
// server program, client program can be found at my Github Repo
int main(int argc, char const *argv[])
{
int serverFd, clientFd;
struct sockaddr_in server, client;
socklen_t len;
// default port if no port is given to listen on!
int port = 1337;
// buffer
char buffer[BUFSIZ];
if (argc == 2)
{
port = atoi(argv[1]);
}
serverFd = socket(AF_INET, SOCK_STREAM, 0);
if (serverFd < 0)
{
perror("Cannot create socket");
exit(1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
len = sizeof(server);
if (bind(serverFd, (struct sockaddr *)&server, len) < 0)
{
perror("Cannot bind socket");
exit(2);
}
if (listen(serverFd, 10) < 0)
{
perror("Listen error");
exit(3);
} else {
printf("Listening on port %d.\n", port);
}
while (1)
{
len = sizeof(client);
if ((clientFd = accept(serverFd, (struct sockaddr *)&client, &len)) < 0)
{
perror("accept error");
exit(4);
}
memset(buffer, 0, sizeof(buffer));
int size = read(clientFd, buffer, sizeof(buffer));
if (size < 0)
{
perror("read error");
exit(5);
}
if (strcmp(buffer, "/shutdown")){
printf("Shutting down\n");
close(clientFd);
break;
} else {
printf("Echo: %s\n", buffer);
}
}
close(serverFd);
return EXIT_SUCCESS;
}
有没有一个很好的方法来实现一个行为,这样当更多的客户端连接到我的端口时,我一次只接受其中的一个并等待它们断开连接(telnet -> (CTRL+5 ))?
问题是
if (strcmp(buffer, "/shutdown"))
如果缓冲区 不 等于“/shutdown”,则 为真,因此您的侦听器在第一次读取后终止。
因为 strcmp()
在我看来 return 不是一个布尔值,所以永远不要写
if (strcmp(...))
或
if (!strcmp( ... ))
但是 - 在你的情况下 -
if (strcmp( ... ) == 0)