我確實創建了一個偵聽埠并在終端上列印訊息的程式。
我的問題是,我想通過 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))?
uj5u.com熱心網友回復:
問題是
if (strcmp(buffer, "/shutdown"))
如果緩沖區不等于“/shutdown”,則為真,因此您的偵聽器在第一次讀取后終止。在我看來,因為strcmp()不回傳布林值,所以永遠不應該寫
if (strcmp(...))
或者
if (!strcmp( ... ))
但是 - 在你的情況下 -
if (strcmp( ... ) == 0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473141.html
