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中的TCP套接字编程)_C_Sockets_Tcp_Server_Client - Fatal编程技术网

在客户端不获取值或垃圾值(C中的TCP套接字编程)

在客户端不获取值或垃圾值(C中的TCP套接字编程),c,sockets,tcp,server,client,C,Sockets,Tcp,Server,Client,我是socket编程的初学者,我正在尝试开发一个简单的程序,客户端向服务器发送一个数字,服务器计算相同的阶乘并将其发送回客户端,客户端打印它 服务器端的计算工作正常,但客户端要么不显示结果,要么打印垃圾值 这背后的原因可能是什么 客户端代码: #include<stdio.h> #include<unistd.h> #include<sys/socket.h> #include<sys/types.h> #include<netinet/in

我是socket编程的初学者,我正在尝试开发一个简单的程序,客户端向服务器发送一个数字,服务器计算相同的阶乘并将其发送回客户端,客户端打印它

服务器端的计算工作正常,但客户端要么不显示结果,要么打印垃圾值

这背后的原因可能是什么

客户端代码:

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#define MAXSIZE 50


main()
{
   int sockfd,retval;
   int recedbytes,sentbytes;
   struct sockaddr_in serveraddr;
   char buff[MAXSIZE];
   sockfd=socket(AF_INET,SOCK_STREAM,0);
   if(sockfd==-1)
   {
       printf("\nSocket Creation Error");

   }
//printf("%i",sockfd);
   serveraddr.sin_family=AF_INET;
   serveraddr.sin_port=htons(3388);
   serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
   retval=connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
   if(retval==-1)
   {
       printf("Connection error");

   }
   while(1)
   {
       printf("Enter the Number: \n");

       scanf("%s",buff);

       sentbytes=send(sockfd,buff,sizeof(buff),0);

       if(sentbytes==-1)
       {
           printf("!!");
           close(sockfd);
       }

       int num=atoi(buff);

       if(num==-1 || num==0)
       {
           break;
       }
       strcpy(buff,"");

       recedbytes=recv(sockfd,buff,sizeof(buff),0);
       printf("The factorial is: ");
       puts(buff);
       printf("\n");
   }
   close(sockfd);
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#define MAXSIZE 90

main()
{
    int sockfd,newsockfd,retval;
    socklen_t actuallen;
    int recedbytes,sentbytes;
    struct sockaddr_in serveraddr,clientaddr;

    char buff[MAXSIZE];
    int a=0;
    sockfd=socket(AF_INET,SOCK_STREAM,0);

    if(sockfd==-1)
    {
        printf("\nSocket creation error");
    }

    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(3388);
    serveraddr.sin_addr.s_addr=htons(INADDR_ANY);
    retval=bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
    if(retval==1)
    {
        printf("Binding error");
        close(sockfd);
    }

    retval=listen(sockfd,1);
    if(retval==-1)
    {
        close(sockfd);
    }

    actuallen=sizeof(clientaddr);
    newsockfd=accept(sockfd,(struct sockaddr*)&clientaddr,&actuallen);


    if(newsockfd==-1)
    {
        close(sockfd);
    }

    while(1)
    {
        // printf("comes here");
        strcpy(buff,"");
        recedbytes=recv(newsockfd,buff,sizeof(buff),0);


        if(recedbytes==0)
            { continue;}

        if(recedbytes==-1)
        {
            close(sockfd);
            close(newsockfd);
        }

        int num=atoi(buff);

        if(num==-1)
        {
            break;
        }


        int res=1;
        int i;
        for(i=1;i<=num;i++)
        {
            res=res*i;
        }
        // printf("hello");


        sprintf(buff, "%d", res);
        printf("The factorial of %i = %s\n",num,buff);
        sentbytes=send(newsockfd,buff,sizeof(buff),0);

        if(sentbytes==-1)
        {
            close(sockfd);
            close(newsockfd);
        }


    }
    close(sockfd);
    close(newsockfd);
}
Enter the Number: 
6
The factorial is: 720
Enter the Number: 
2
The factorial is: 
Enter the Number: 
4
The factorial is: 2
Enter the Number: 
7
The factorial is: 
Enter the Number: 
2
The factorial is: /V
Enter the Number: 
5
The factorial is: /V
Enter the Number:

The factorial of 6 = 720
The factorial of 2 = 2
The factorial of 4 = 24
The factorial of 7 = 5040
The factorial of 2 = 2
The factorial of 5 = 120
服务器端:

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#define MAXSIZE 50


main()
{
   int sockfd,retval;
   int recedbytes,sentbytes;
   struct sockaddr_in serveraddr;
   char buff[MAXSIZE];
   sockfd=socket(AF_INET,SOCK_STREAM,0);
   if(sockfd==-1)
   {
       printf("\nSocket Creation Error");

   }
//printf("%i",sockfd);
   serveraddr.sin_family=AF_INET;
   serveraddr.sin_port=htons(3388);
   serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
   retval=connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
   if(retval==-1)
   {
       printf("Connection error");

   }
   while(1)
   {
       printf("Enter the Number: \n");

       scanf("%s",buff);

       sentbytes=send(sockfd,buff,sizeof(buff),0);

       if(sentbytes==-1)
       {
           printf("!!");
           close(sockfd);
       }

       int num=atoi(buff);

       if(num==-1 || num==0)
       {
           break;
       }
       strcpy(buff,"");

       recedbytes=recv(sockfd,buff,sizeof(buff),0);
       printf("The factorial is: ");
       puts(buff);
       printf("\n");
   }
   close(sockfd);
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#define MAXSIZE 90

main()
{
    int sockfd,newsockfd,retval;
    socklen_t actuallen;
    int recedbytes,sentbytes;
    struct sockaddr_in serveraddr,clientaddr;

    char buff[MAXSIZE];
    int a=0;
    sockfd=socket(AF_INET,SOCK_STREAM,0);

    if(sockfd==-1)
    {
        printf("\nSocket creation error");
    }

    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(3388);
    serveraddr.sin_addr.s_addr=htons(INADDR_ANY);
    retval=bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
    if(retval==1)
    {
        printf("Binding error");
        close(sockfd);
    }

    retval=listen(sockfd,1);
    if(retval==-1)
    {
        close(sockfd);
    }

    actuallen=sizeof(clientaddr);
    newsockfd=accept(sockfd,(struct sockaddr*)&clientaddr,&actuallen);


    if(newsockfd==-1)
    {
        close(sockfd);
    }

    while(1)
    {
        // printf("comes here");
        strcpy(buff,"");
        recedbytes=recv(newsockfd,buff,sizeof(buff),0);


        if(recedbytes==0)
            { continue;}

        if(recedbytes==-1)
        {
            close(sockfd);
            close(newsockfd);
        }

        int num=atoi(buff);

        if(num==-1)
        {
            break;
        }


        int res=1;
        int i;
        for(i=1;i<=num;i++)
        {
            res=res*i;
        }
        // printf("hello");


        sprintf(buff, "%d", res);
        printf("The factorial of %i = %s\n",num,buff);
        sentbytes=send(newsockfd,buff,sizeof(buff),0);

        if(sentbytes==-1)
        {
            close(sockfd);
            close(newsockfd);
        }


    }
    close(sockfd);
    close(newsockfd);
}
Enter the Number: 
6
The factorial is: 720
Enter the Number: 
2
The factorial is: 
Enter the Number: 
4
The factorial is: 2
Enter the Number: 
7
The factorial is: 
Enter the Number: 
2
The factorial is: /V
Enter the Number: 
5
The factorial is: /V
Enter the Number:

The factorial of 6 = 720
The factorial of 2 = 2
The factorial of 4 = 24
The factorial of 7 = 5040
The factorial of 2 = 2
The factorial of 5 = 120

您的服务器正在发回一个90字节的缓冲区,而您的客户端正在读取一个50字节的缓冲区。这意味着客户端首先读取以预期字符串开头的50个字节。然后在下一次调用
recv
时,将读取同一消息中最可能包含垃圾的下40个字节。此调用可能还包含结尾处下一条消息的前10个字节


最简单的解决方法是将
send
调用更改为发送
strlen(buf)+1
字节,而不是
sizeof(buf)
字节,这样您只发送所需的数据。

您的服务器正在发回一个90字节的缓冲区,而您的客户端正在读取一个50字节的缓冲区。这意味着客户端首先读取以预期字符串开头的50个字节。然后在下一次调用
recv
时,将读取同一消息中最可能包含垃圾的下40个字节。此调用可能还包含结尾处下一条消息的前10个字节


最简单的解决方法是将
send
调用更改为send
strlen(buf)+1
字节,而不是
sizeof(buf)
字节,这样您只发送所需的数据。

首先,在客户端检查
recv
的返回值。TCP是一种流协议。无法保证任何给定的
recv
呼叫都会收到发送方发送的所有信息。需要循环,直到收到所有“例外”数据。在这种情况下,直到收到完整字符串(即NUL终止符)。可能无法解决您的问题,但这样做是否正确值得一试。对于初学者,请在客户端检查
recv
的返回值。TCP是一种流协议。无法保证任何给定的
recv
呼叫都会收到发送方发送的所有信息。需要循环,直到收到所有“例外”数据。在这种情况下,直到收到完整字符串(即NUL终止符)。可能无法解决您的问题,但这样做是否正确值得一试。这解决了问题这解决了问题