gpt4 book ai didi

c - 服务器中的 accept() 函数似乎不接受来自客户端的新连接

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:42 26 4
gpt4 key购买 nike

我正在尝试 UNIX 网络编程 中的代码,套接字网络 API我在哪里遇到了一个简单的服务器客户端和基于服务器的示例的代码

服务器的代码是

#define BL 10

void *get_in_addr(struct sockaddr *sa)
{
if (sa->sa_family == AF_INET)
{
return &(((struct sockaddr_in*) sa)->sin_addr);
}
return &(((struct sockaddr_in6*) sa)->sin6_addr);
}

int main(int argc, char ** argv)
{
struct sockaddr_in server, client;
int listenfd;
int port;

if (argc < 2)
{
printf("Port Not specified Error ~~ ! ");
exit(0);
}

port = atoi(argv[1]);
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htons(INADDR_ANY);
server.sin_port = htons(port);

listenfd = socket(AF_INET, SOCK_STREAM, 0);

if (bind(listenfd, (struct sockaddr *) &server, sizeof(server)) == 0)
printf("\n [~] Bind Sucessfull \n");

if (listen(listenfd, BL) == 0)
printf("\n [~] Listenig on port %d \n\n ", port);

while (1)
{
socklen_t clientlen = sizeof(client);
printf("%d", clientlen);
int conffd = accept(listenfd, (struct sockaddr *) &client, &clientlen);
char s[INET6_ADDRSTRLEN];
inet_ntop(AF_INET, get_in_addr((struct sockaddr *) &client), s, sizeof(s));
if (conffd == -1)
printf("\n not Accepted \n");
else
{
printf("Got a connection from %s", s);
}
}

return 0;
}

然后客户端的代码是

int main(int argc, char ** argv)
{

struct sockaddr_in server;
int listenfd;
int port = 11111;
memset(&server, 0, sizeof(server));
inet_pton(AF_INET, argv[1], &server.sin_addr);
server.sin_family = AF_INET;
server.sin_port = htons(port);

listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (connect(listenfd, (struct sockaddr *) &server, sizeof(server)) != 0)
{
printf("Connection error ! \n");
}

return 0;
}

这里的问题是当我启动服务器并运行客户端时,服务器没有任何反应,但它应该说“从#IP 获得连接”

输出是:

./server 11111

[~] Bind Sucessfull

[~] Listenig on port 11111

应该已经输出了:

./server 11111

[~] Bind Sucessfull

[~] Listenig on port 11111

Got an connection from 127.0.0.1

所以我认为客户端有问题,

所以我检查了一下,我关闭了服务器并再次运行客户端,现在它说连接错误

这意味着客户端工作正常,所以问题出在服务器的 accept()

我似乎找不到导致问题的原因。

如果有人能解释什么地方出了问题,那将非常有帮助:)

最佳答案

根据上面的评论,你应该知道标准输出 stdoutline buffered,这意味着,它将缓冲区的内容发送到仅在遇到换行符 \n 时输出屏幕。因此,除非您的打印字符串有换行符[或者您使用 fflush(stdout)] 手动刷新缓冲区,否则缓冲区的内容不会刷新到屏幕。

在您的代码中,在成功的 accept() 后,将调用 printf() 并发送 printf() 提供的字符串到与 stdout 相关的缓冲区,但内容不会刷新到屏幕。控件将继续,并在下一次 accept() 调用中处于阻塞 状态。因此,在您的情况下,您的输出缓冲区没有机会刷新到屏幕。

请在您的打印字符串中添加换行符 [\n]。它会立即刷新缓冲区的内容,您将能够在屏幕上看到输出。

 printf("Got a connection from %s\n", s);

旁注:[只是为了检查输出缓冲区中内容的存在] 正如我们所知,程序终止将导致所有相关缓冲区被刷新,您可以尝试终止服务器手动执行,[也许通过按 crtl+c],你将能够在屏幕上看到打印语句

关于c - 服务器中的 accept() 函数似乎不接受来自客户端的新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27645500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com