客户端和服务器程序问题

时间:2013-03-06 17:25:33

标签: c sockets

我正在构建一个客户端和服务器程序。下面是服务器端主函数中引用套接字的代码:

   listenfd = socket(AF_INET, SOCK_STREAM, 0);
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
   serv_addr.sin_port = htons(5000); 

   bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

   listen(listenfd, 10);
   pthread_t thread[10];
   while(1)
   {
       connfd[i] = accept(listenfd, (struct sockaddr*)NULL, NULL);
       //I WANT TO GET THE IP ADDRESS HERE
       if( pthread_create(&thread[i], NULL, listener, NULL ) != 0 )
       {
           printf("Cannot create thread , exiting \n ");
           exit(-1);
       }
       i++;
   }

,线程如下:

void * listener( void * temp_pt )
{
    int connfdLocal=connfd[i];
    while ( (n = read(connfdLocal, recvBuff, sizeof(recvBuff)-1)) > 0)
    {
        printf("TESTING LISTENER");         
        write(connfdLocal, "TEST", strlen("TEST"));     
    }

    if(n <= 0)
    {
        printf("\n Connection lost \n");
        close(connfdLocal);
        return 0;
    } 

}

好吧,我有3个问题:

  1. 由于某种原因,在与客户端的连接关闭之前,线程不会打印“TESTING LISTENER”,我必须关闭客户端的连接。同样,直到我关闭服务器上的连接,才将字符串“TEST”发送到客户端。为什么会这样?我该如何解决?

  2. 建立连接后,有什么办法可以获取客户端的IP地址吗?就在我打字的地方“我想在这里获得IP地址”

  3. 有人可以向我解释当客户端关闭套接字时,'n'是如何立即转为0的?我认为read函数只运行一次,n值只设置一次。

2 个答案:

答案 0 :(得分:0)

这可能是因为缓冲而发生的。所以printf确实被调用,但文本位于stdio缓冲区中。尝试:

printf("TESTING LISTENER\n");
fflush(stdout);

客户也一样。

  

有什么方法可以获取客户端的IP地址

您需要getpeername(2)函数。

  

我认为read函数只运行一次而n值只是   设置一次

这是每次通话时收到的字节数。这不是固定值。

答案 1 :(得分:0)

  

由于某种原因,在与客户端的连接关闭之前,线程不会打印“TESTING LISTENER”,我必须关闭客户端的连接。同样,直到我关闭服务器上的连接,才将字符串“TEST”发送到客户端。为什么会这样?我该如何解决?

我需要更多信息:

  1. 如何定义recvBuff?
  2. 是在堆上还是在堆栈上定义的?
  3. 您是在本地计算机还是远程检查此连接?
  4. 您是否在写入服务器时检查了客户端的错误代码?
  5. 您检查过防火墙设置吗?
  6.   

    建立连接后,有什么办法可以获取客户端的IP地址吗?就在我打字的地方“我想在这里获得IP地址”

    是的,你可以。只需声明并传递“struct sockaddr&amp;”在接受参数。

    struct sockaddr cli_addr; 
    connfd[i] = accept(listenfd, (struct sockaddr*)&cli_addr, sizeof(cli_addr));
    char *connected_ip = inet_ntoa(cli_addr.sin_addr); //Client Ip Address
    int port = ntohs(cli_addr.sin_port); //Client's Port
    
      

    有人可以向我解释一下,当客户端关闭套接字时,'n'是如何立即转为0的?我认为read函数只运行一次,n值只设置一次。

    从客户端收到的总字节数。它变为零,因为套接字从远程端关闭。什么时候没有来自仪式的资料来阅读...