c - 在 C 中 echo 客户端-服务器

标签 c tcp client-server

我也是套接字编程和 C 的新手。我正在创建一个简单的回显客户端服务器应用程序,其操作如下 例如:**如果客户端发送“hi”----服务器接收“wellcome”
如果客户端发送“再见”-----服务器接收“再见”

否则,如果我发送任何其他字符串,我将接收我发送的内容**

这是我的服务器:

#include<stdio.h>
#include<string.h>  //strlen
#include<sys/socket.h>
#include<arpa/inet.h>   //inet_addr
#include<unistd.h>  //write

int main(int argc , char *argv[])
{
   int socket_desc , client_sock , c , read_size;
   struct sockaddr_in server , client;
   char client_message[2000];
   char wellcome[]="wellcome", seeyou[]="see you",hi[]="hi",bye[]="bye";

   //Create socket
   socket_desc = socket(AF_INET , SOCK_STREAM , 0);
   if (socket_desc == -1)
   {
       printf("Could not create socket");
   }
   puts("Socket created");

   //Prepare the sockaddr_in structure
   server.sin_family = AF_INET;
   server.sin_addr.s_addr = INADDR_ANY;
   server.sin_port = htons( 8882 );

   //Bind
   if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
   {
       //print the error message
       printf("bind failed. Error");
       return 1;
   }
   puts("bind done");

   //Listen
   listen(socket_desc , 3);

   //Accept and incoming connection
   puts("Waiting for incoming connections...");
   c = sizeof(struct sockaddr_in);

   //accept connection from an incoming client
   client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
   if (client_sock < 0)
   {
       printf("accept failed");
       return 1;
   }
   puts("Connection accepted");

   //Receive a message from client
   while( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0 )
   {
       //Send the message back to client
       *(client_message + read_size) = '\0';
    //*(wellcome + read_size) = '\0';
    //*(seeyou + read_size) = '\0';
    if(strcmp(client_message,hi)==0)
        write(client_sock, wellcome, strlen(wellcome));
    else
        if (strcmp(client_message,bye)==0)
            write(client_sock, seeyou, strlen(seeyou));


       write(client_sock , client_message , strlen(client_message));
   }

   if(read_size == 0)
   {
       puts("Client disconnected");
       fflush(stdout);
   }
   else if(read_size == -1)
   {
       printf("recv failed");
   }

   return 0;
}

和客户端:

#include<stdio.h>   
#include<string.h>  
#include<sys/socket.h>  
#include<arpa/inet.h>   

int main(int argc , char *argv[])
{
    int sock;
    struct sockaddr_in server;
    char message[1000] , server_reply[2000];

    //Create socket
    sock = socket(AF_INET , SOCK_STREAM , 0);
    if (sock == -1)
    {
        printf("cound'n create socket");
    }
    puts("Socket created");

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons( 8792 );

    //Connect to remote server
    if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        printf("connection error");
        return 1;
    }

    puts("Connected\n");

    //keep communicating with server
    while(1)
    {
        printf("write your message : ");
        gets(message);

        //Send some data
        if( send(sock , message , strlen(message) , 0) < 0)
        {
            puts("send error");
            return 1;
        }

        //Receive a reply from the server
    bzero(server_reply,2000);
        if( recv(sock , server_reply , 2000 , 0) < 0)
        {
            puts("recv failed");
            break;
        }

        puts("Server reply :");
        puts(server_reply);
    }

    close(sock);
    return 0;
}

我运行了它 服务器:

[root@localhost chat]# gcc -o newser newser.c
[root@localhost chat]# ./newser
Socket created
bind done
Waiting for incoming connections...
Connection accepted

这是客户端的问题:

[root@localhost chat]# ./client 127.0.0.1
Socket created
Connected

write your message : hi
Server reply :
wellcome
write your message : bye
Server reply :
hi
write your message : bye
Server reply :
see youbye
write your message : hey buddy
Server reply :
see youbye
write your message : hey ya
Server reply :
hey buddy
write your message : 

你可以看到:如果我打个招呼,服务器就会回复欢迎。 如果我说再见,服务器就会回复你好。 如果我说再见,服务器回复再见(这不是我所期待的)。

最佳答案

我认为,问题出在这里:

   write(client_sock , client_message , strlen(client_message));

为什么要向客户端发送客户端消息?

另一个问题可能来自部分写入:检查写入调用的返回值。

请使用 fgets 而不是 gets。请参阅 gets(3)。

关于c - 在 C 中 echo 客户端-服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378910/

相关文章:

python - #include <Python.h> Windows 10 修复没有这样的文件或目录

tcp - 最小的 TCP/IP 开销(通过以太网帧)

java - 如何编写一个聊天程序,就像 gtalk 或 yahoo 一样

java - 是否有 API 可以获取 GCP AI Hub 中的所有公共(public)类别

C:来自用户的未知输入

c - 使用 memset() 并解释函数的 size_t 数字

c - C 编程中未定义的函数引用

linux - 如何在 Linux 中禁用 TCP 慢启动?

http - Golang RPC http.Serve 与 rpc.ServeConn(HTTP 与原始连接)

javascript - 当我登录时,星巴克在 URL 中填充什么?