聊天服务器(C 语言中的网络编程)



>我用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));

最新更新