客户端和服务器程序问题

标签 c sockets

我正在构建一个客户端和服务器程序。下面是服务器端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 值只设置一次。

最佳答案

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

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

对于客户端来说也是如此。

Is there any way I can get the ip address of the client

您需要函数getpeername(2)

I thought the read function was only run once and the n value was only set once

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

关于客户端和服务器程序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253980/

相关文章:

c - 使用Linux POSIX IPC消息队列

c - 如何找到目标文件之间的依赖关系?

C - 如果缓冲区更大,如何处理文件的最后一部分?

c - 如何将文件内容写入管道?

python - 在python中获取ipv6地址不起作用

c - C 中涉及套接字和客户端-服务器通信的程序问题

c - 如何显示从文件中读取的分数

java - 反序列化通过 ObjectOutpoutStream 发送的对象

德尔福。 socket 。仅在一个节点/MAC 地址上的 TIdHttp 套接字连接上访问被拒绝。必发API

Android Lollipop Wifi 套接字 java.net.ConnectException ETIMEDOUT