>我用c制作了以下聊天服务器程序。问题是,一旦我运行我的客户端并且"客户端说:-"显示在客户端屏幕上,服务器就会立即显示"客户端说:-","服务器说:-",而无需等待客户端给出输入然后处理它,无论我输入什么,程序都不起作用。
我希望我的客户端请求输入然后将其发送到服务器,然后服务器应该显示客户端的输入并请求它自己的输入。这应该一直持续下去,直到他们中的任何一个人进入"再见"。
聊天服务器
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<string.h>
#include<errno.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
perror("Error in Creating Socketn");
exit(-1);
}
struct sockaddr_in server,client;
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(10000);
server.sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr*)&server, sizeof(server))<0)
{
perror("Error in Socket Bindingn");
exit(-1);
}
if(listen(sockfd,5)<0)
{
perror("Error in Listeningn");
exit(-1);
}
printf("Listeningn");
char clientsent[500];
char bhago[5] = "exit";
bhago[5] = ' ';
char serverinput[500];
while(1)
{
int acceptfd = accept(sockfd, (struct sockaddr*)&client, (socklen_t*)sizeof(client));
pid_t pid = fork();
if(pid == 0)//child process is executing
{
close(sockfd);
while(1)
{
bzero(&serverinput, 500);
bzero(&clientsent, 500);
int n = recv(acceptfd, clientsent,500,0);
printf("Client Says :-n");
printf("%s",clientsent);
if(strcmp(clientsent,bhago) == 0)
{
close(acceptfd);
exit(0);
}
printf("Server Says :-n");
int x = 0;
do{
serverinput[x]=getchar();
x++;
}while(x-1 != 'n');
send(acceptfd, serverinput, 500, 0);
if(strcmp(serverinput,bhago) == 0)
{
close(acceptfd);
exit(0);
}
}
}
close(acceptfd);
}
}
聊天客户端
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<string.h>
#include<errno.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
perror("Error in Creating Socketn");
exit(-1);
}
struct sockaddr_in server;
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(10000);
server.sin_addr.s_addr = INADDR_ANY;
if(connect(sockfd, (struct sockaddr*)&server, sizeof(server))<0)
{
perror("Error in Connectionn");
exit(-1);
}
printf("Connection Establishedn");
char clientinput[500];
char bhago[5] = "exit";
bhago[5] = ' ';
char serversent[500];
while(1)
{
bzero(&clientinput, 500);
bzero(&serversent, 500);
printf("Client Says :-n");
int x = 0;
do{
clientinput[x]=getchar();
x++;
}while(x-1 != 'n');
send(sockfd, clientinput, 500, 0);
if(strcmp(clientinput, bhago) == 0)
{
close(sockfd);
exit(0);
}
printf("Server Said :-n");
recv(sockfd, serversent, 500,0);
printf("%s",serversent);
if(strcmp(serversent, bhago) == 0)
{
close(sockfd);
exit(0);
}
}
close(sockfd);
}//main
对于初学者来说,这两行中的后者
char bhago[5] = "exit";
bhago[5] = ' ';
通过访问第 6 个元素(bhago
个元素宽)写出 bhago
的边界来调用未定义的行为。从现在开始,任何事情都可能发生。
在 C 数组中,索引是基于0
的。这里的第一个元素是 bhago[0]
.
而这个
..., (socklen_t*)sizeof(client));
是完全可怕的错误。不要盲目地抛弃编译错误。指针是必需的,代码传递编译时常量,在此处再次调用未定义的行为。我希望代码会随着这一行的执行而立即死亡。
accept()
期望socklen_t *
作为最后一个参数,因此传递一个:
socklen_t socklen = sizeof client;
..., &socklen));