我正在尝试来自 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()
我似乎无法找到导致问题的原因。
如果有人能解释什么是错的,那将是非常有帮助的。:)
答案 0 :(得分:3)
作为上述评论的后续内容,您应该知道标准输出stdout
是行缓冲,这意味着,它会将缓冲区的内容发送到输出屏幕只有遇到换行符\n
。因此,除非您的打印字符串有换行符[或者您使用fflush(stdout)
手动刷新缓冲区],否则缓冲区的内容将不会刷新到屏幕上。
在您的代码中,成功accept()
后,调用printf()
并将printf()
提供的字符串发送到与stdout
相关的缓冲区,但内容为不刷新到屏幕上。控件将继续,并在下一次accept()
调用中处于阻止状态。因此,您的输出缓冲区没有机会在您的情况下刷新到屏幕。
请在打印字符串中添加换行符[\ n]。它将立即刷新缓冲区的内容,并且您将能够在屏幕上看到输出。
printf("Got a connection from %s\n", s);
SideNote: [仅用于检查输出缓冲区中是否存在内容] 正如我们所知,程序终止将导致刷新所有关联的缓冲区,您可以尝试终止手动执行服务器,[可能通过按crtl + c],你将能够在屏幕上看到打印语句
答案 1 :(得分:-1)
在服务器代码中更改下面给出的行
server.sin_addr.s_addr = htons(INADDR_ANY);
到
server.sin_addr.s_addr = INADDR_ANY;