我有一个在 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;
在客户端
创建套接字并在本地绑定(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
将数据包发送到服务器。
//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));
发送最后一个数据包并关闭本地套接字。
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/