C 从客户端向服务器提交命令

标签 c linux sockets unix udp

我有一个在 UDP 上运行的客户端-服务器应用程序(我需要它 UDP 而不是 tcp)。 客户端可以向服务器发送消息并且它工作正常,反之亦然。 我希望客户端能够传递一条消息作为“_connect game1 10”并在服务器上相应地触发一个函数,该函数称为_connect(char *name, int num)。 如何执行此操作以分析每个命令以触发什么命令?序列化是一种解决方案以及如何实现它。

最佳答案

您可以按照以下步骤进行操作 1.创建消息结构

    typedef struct info
    {
        char clientReq[MAX_LENGTH];
        char sub[MAX_LENGTH];
        u_int32_t value;
        u_int16_t end; //Set for the packet which closes the connection 

     }messageInfo; 

在客户端

  1. 创建套接字并在本地绑定(bind)//并连接到服务器套接字(可选)

    fd = socket( family, SOCK_DGRAM, 0 );
    //handle error
    struct sockaddr_in         peerV4;
    struct sockaddr_in         clientV4;
    rc = bind(fd,(struct sockaddr *) &clientV4,
                             sizeof clientV4);
    //error handling
    
  2. 将数据包发送到服务器。

        //update peer(server) socket info here
        peerV4.sin_family = AF_INET;
        peerV4.sin_port = htons(serverPort);
        peerV4.sin_addr.s_addr = "x.x.x.x";
        uint8_t *tBuf = (uint8_t *)malloc(sizeof (info)); //memset to zero
        info *pHeader = (info *)tBuf;
        pHeader->value = htonl(10); //local value to send
        pHeader->end = htons(0);
        pHeader->clientReq  = "connect";
        pheader->sub = "game1";
        sendto(serverSock, tBuf, sizeof(info),0
                                     ,(struct sockaddr *) &peerV4,
                                     sizeof(peerV4));
    
  3. 发送最后一个数据包并关闭本地套接字。

       pHeader->end = htons(1); // so the server closes the socket
       //send packet
       close(fd);
    

在服务器上 1. 创建一个 UDP 套接字,绑定(bind)到本地地址等待客户端向您发送数据并使用 recvfrom

      fd = socket( family, SOCK_DGRAM, 0 );
      //bind socket
      uint8_t *recvBuf = (uint8_t *)malloc(sizeof(info));
      info *pheader = (info *)recvBuf;
      int currLen = recvfrom( fd, recvBuf,
                  mBufLen),0,(struct sockaddr *)&peerV4,
                     &sockaddrLen);
      //error handling
      if(currLen > 0)
      {
           if(htons(pheader->end) == 1)
             //close socket
           char *localSub = pheader->sub;
           char *localRecv = pheader->clientReq;
           //do something with the values on the server like
           if (strcasecmp(localRecv,"connect")     == 0) //pseudo
                connect(sub,pheader->value)
      }

关于C 从客户端向服务器提交命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972152/

相关文章:

c - 如何使用 Lua 中的函数指针和 SWIG 绑定(bind)来调用函数?

c - 如何从 x86_64 windows 异常处理程序中正确调用 rtlunwind

linux权限,X是什么?

linux - 从 usr/include 中删除一个文件?

Java UDP 数据报包 - 切片数据以适应缓冲区大小

c - 为什么 main char **argv 的参数是 c 中的字符串数组

c++ - 自动卸载 OS X 驱动程序

linux - 从 USB 启动 applescript?

linux - 我们能否以某种自动方式设置用于监听的端口号而不是对其进行硬编码?

python - 创建原始套接字时出错