【问题标题】:Client&Server program issue客户端和服务器程序问题
【发布时间】:2013-03-06 17:25:33
【问题描述】:

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

   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值只设置一次。

【问题讨论】:

    标签: c sockets


    【解决方案1】:

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

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

    客户端也是如此。

    有什么办法可以得到客户端的ip地址

    你需要函数getpeername(2)

    我以为 read 函数只运行一次,n 值只是 设置一次

    这是每次调用接收到的字节数。这不是一个固定值。

    【讨论】:

    • 谢谢,我为“TESTING LISTENER”工作,但是在服务器关闭之前“TEST”仍未发送到客户端,我不知道如何刷新“connfdLocal”。客户端实际上是用java编程的,我应该在那里添加一个fflush吗?
    • 关于第三个问题我的意思是我认为函数读取应该只在客户端连接到服务器时运行一次,但是它似乎在客户端关闭后立即设置为负值插座。
    • @user2071976 不,它应该连续运行,直到返回 0 或 -1。
    【解决方案2】:

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

    我需要更多信息:

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

    有什么方法可以在建立连接后获取客户端的ip地址?就在我输入“我想在这里获取 IP 地址”的地方

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

    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值只设置一次。

    它是从客户端收到的总字节数。它变为零,因为套接字从远程端关闭。从 rite 中没有可读取的来源时该读取什么...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多