在客户端不获取值或垃圾值(C中的TCP套接字编程)
我是socket编程的初学者,我正在尝试开发一个简单的程序,客户端向服务器发送一个数字,服务器计算相同的阶乘并将其发送回客户端,客户端打印它 服务器端的计算工作正常,但客户端要么不显示结果,要么打印垃圾值 这背后的原因可能是什么 客户端代码:在客户端不获取值或垃圾值(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
#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
调用更改为sendstrlen(buf)+1
字节,而不是sizeof(buf)
字节,这样您只发送所需的数据。首先,在客户端检查recv
的返回值。TCP是一种流协议。无法保证任何给定的recv
呼叫都会收到发送方发送的所有信息。需要循环,直到收到所有“例外”数据。在这种情况下,直到收到完整字符串(即NUL终止符)。可能无法解决您的问题,但这样做是否正确值得一试。对于初学者,请在客户端检查recv
的返回值。TCP是一种流协议。无法保证任何给定的recv
呼叫都会收到发送方发送的所有信息。需要循环,直到收到所有“例外”数据。在这种情况下,直到收到完整字符串(即NUL终止符)。可能无法解决您的问题,但这样做是否正确值得一试。这解决了问题这解决了问题