c - 使用UDP向服务器发送结构,为什么服务器得到错误的数字?
问题描述
我正在尝试将结构发送到服务器,但是当我运行服务器时,数据始终为零。
这是客户端和服务器端结构的定义:
typedef struct {
unsigned char a;
unsigned char b;
unsigned char c;
}S_sendtoScreen;
客户端主函数内容如下:
S_sendtoScreen sendtoScreen,net_sendtoScreen;
sendtoScreen.a = 1;
sendtoScreen.b = 2;
sendtoScreen.c = 3;
net_sendtoScreen.a = htons(sendtoScreen.a);
net_sendtoScreen.b = htons(sendtoScreen.b);
net_sendtoScreen.c = htons(sendtoScreen.c);
// Filling client information
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");机 IP
servaddr.sin_port = htons(8882);
// Filling server information loccal port 8082
clientaddr.sin_family = AF_INET;
clientaddr.sin_port = htons(8881);
clientaddr.sin_addr.s_addr =htonl(INADDR_ANY);
if (bind(sockfd, (const struct sockaddr *)&clientaddr,
sizeof(clientaddr)) == SOCKET_ERROR)
{
perror("bind failed");
getchar();
}
int n, len;
len = sizeof(struct sockaddr);
while (1){
//int nochecksum = 0;
//setsockopt(sockfd, IPPROTO_IP, IPPROTO_UDP, &nochecksum, sizeof(nochecksum));
memcpy(buffer,&net_sendtoScreen,sizeof(net_sendtoScreen));
if((n = sendto(sockfd, (const char *)buffer, sizeof(buffer),
0, (const struct sockaddr *) &servaddr,sizeof(servaddr)))<0)
{
printf("send error\n");
}
printf("n=%d", n);
printf("struc sendtoScreen message sent.\n");
Sleep(200);
}
这是下面的服务器代码:
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8882);
cliaddr.sin_family = AF_INET; // IPv4
cliaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cliaddr.sin_port = htons(8881);
使用 recvfrom() 接受结构:
int len, n,m;
len = sizeof(struct sockaddr_in);
while (1){
FD_ZERO(&fds);
FD_SET(sockfd, &fds);
rc = select(0, &fds, NULL, NULL, &wait);
if (rc == 0)
{
printf("time out\n");
}
else if (rc < 0){
perror("select() error\n");
}
else if (FD_ISSET(sockfd, &fds))
{
n = recvfrom(sockfd, (char *)buffer, MAXLINE, 0,
(struct sockaddr *) &cliaddr, &len);
if (n < 0){
printf("recvfrom() error,can't recieve the package\n");
}
else{
printf("recvbytes = %d\n", n);
buffer[n] = "\0";
memcpy(&net_recvFromBoard, buffer, sizeof(buffer));
recvFromBoard.a = ntohs(net_recvFromBoard.a);
recvFromBoard.b = ntohs(net_recvFromBoard.b);
recvFromBoard.c = ntohs(net_recvFromBoard.c);
//this three value always equal to zero
printf("recvFromBoard.a = %u,recvFromBoard.b =
%u,recvFromBoard.c = %u", net_recvFromBoard.a,
net_recvFromBoard.b,net_recvFromBoard.c);
}
}
希望得到您的帮助,在此先感谢。
解决方案
推荐阅读
- jsf - Chrome 在文件下载时返回 ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION 错误
- python - 查找修改后的图像 - 图像取证
- javascript - 在嵌入标签中加载的 PDF 中禁用右键单击事件
- keycloak - 带有瑞典银行 ID 的 Keycloak
- json - 处理嵌入在字符串中的换行符
- for-loop - 在 Kotlin 的嵌套 for 循环中满足 If 条件时,将数据添加到 arrayList
- mysql - 使用 for 循环插入多个数据的 SQL 查询
- intellij-idea - 如何将文件头包含到已在 IntelliJIdea 中创建的所有 java 类和接口中
- node.js - NextJs 应用程序 100% CPU 使用率
- php - 如何在 Laravel 的模态中指定创建函数的可为空值?