Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 客户及;服务器程序问题_C_Sockets - Fatal编程技术网

C 客户及;服务器程序问题

C 客户及;服务器程序问题,c,sockets,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*)&se

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

   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;
    } 

}
void*侦听器(void*temp\u pt)
{
int connfdLocal=connfd[i];
而((n=read(connfdLocal,recvBuff,sizeof(recvBuff)-1))>0)
{
printf(“测试侦听器”);
写(connfdLocal,“TEST”,strlen(“TEST”));
}

如果(n这可能是因为缓冲。因此确实会调用
printf
,但文本位于
stdio
缓冲区中。请尝试:

printf("TESTING LISTENER\n");
fflush(stdout);
客户也是如此

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

您需要函数
getpeername(2)

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

它是每次调用时接收的字节数,不是固定值

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

我需要更多信息:

  • recvBuff是如何定义的
  • 它是在堆上定义的还是在堆栈上定义的
  • 您是在本地计算机还是远程计算机上检查此连接
  • 当客户端写入服务器时,您是否检查了客户端的错误代码
  • 你检查防火墙设置了吗
  • 在建立连接后,有没有办法获取客户端的ip地址?就在我键入“我想在这里获取ip地址”的地方

    可以。只需在accept参数中声明并传递“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读取的源时,应该读取什么…

    谢谢,我为“TESTING LISTENER”工作,但是直到服务器关闭,“TEST”仍然没有发送到客户端,我不知道如何刷新“connfdLocal”。客户端实际上是用java编程的,我应该在那里添加一个fflush吗?关于第三个问题,我的意思是,我认为当客户端连接到服务器时,函数read应该只运行一次,但是在客户端关闭套接字之后,它似乎被设置为负值。@user2071976否,它应该继续运行直到返回0或-1为止。