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

时间:2014-12-25 08:23:57

标签: c sockets networking unix-socket

我正在尝试来自 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()

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

如果有人能解释什么是错的,那将是非常有帮助的。:)

2 个答案:

答案 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;