我试图通过UDP套接字将结构从客户端发送到服务器。
代码如下:
文件:coapHead.h
...
typedef struct{
uint8_t ver : 2;
uint8_t t : 2;
uint8_t tkl : 4;
uint8_t code;
uint16_t id;
} coap_header;
typedef struct coap_packet{
coap_header hdr;
coap_buffer tok;
uint8_t numopt;
coap_option opt[MAXOPT];
coap_buffer payload;
} coap_packet;
...
文件:udpser.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "coapHead.h"
#define PORT 8080
#define MAXLINE 1024
int main(){
printf("....0\n");
int sockfd;
char buffer[MAXLINE];
char *hello = "Hello from server. Packet Received.";
struct sockaddr_in servaddr, cliaddr;
printf("....1\n");
// struct coap_packet *temp = (struct coap_packet*)malloc(sizeof(coap_packet));
coap_packet *temp = malloc(sizeof(coap_packet));
printf("....2\n");
//Creating socket file descriptor
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
printf("....3\n");
//Filling information
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
printf("....4\n");
//Binding socket with server address
if(bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
perror("Binding Failed!");
exit(EXIT_FAILURE);
}
printf("....5\n");
int i=0;
//while(i<6){
int n, len, clilen;
clilen = sizeof(cliaddr);
printf("....6\n");
n = recvfrom(sockfd, temp, sizeof(*temp), 0, (struct sockaddr *)&cliaddr, &clilen);
// n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *)&cliaddr, &len);
// n = read(sockfd, buffer, MAXLINE);
// n = read(sockfd, &temp, sizeof(coap_packet));
// buffer[n] = '\0';
printf("....7\n");
// printf("Client: %s\n", buffer);
printf("Client Packet received.\nMessage ID: %d\nMessage Type: %d\nVersion: %d\nCode: %d\n", (temp->hdr).id, (temp->hdr).t, (temp->hdr).ver, (temp->hdr).code);
sendto(sockfd, (const char*)hello, strlen(hello), MSG_CONFIRM, (const struct sockaddr *)&cliaddr, sizeof(cliaddr));
// send(sockfd, (const char *)hello, strlen(hello), 0);
printf("Hello message sent.\n");
i+=1;
//}
return 0;
}
文件:udpcli.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "coapHead.h"
#define PORT 8080
#define MAXLINE 1024
int main(){
int sockfd;
char buffer[MAXLINE];
printf("....0\n");
char *hello = "Hello from Client.";
printf("....0.1\n");
struct sockaddr_in servaddr;
printf("....0.2\n");
struct coap_packet *pkt;
pkt = malloc(sizeof(coap_packet));
printf("....0.3\n");
pkt->hdr.ver = 1;
pkt->hdr.t = coap_con;
pkt->hdr.tkl = 0;
pkt->hdr.code = coap_get;
pkt->hdr.id = 1002;
printf("....1\n");
printf("ver: %d\n", pkt->hdr.ver);
printf("typ: %d\n", pkt->hdr.t);
printf("tkl: %d\n", pkt->hdr.tkl);
printf("code: %d\n", pkt->hdr.code);
printf("ID: %d\n", pkt->hdr.id);
printf("....1.1\n");
//Creating socket file descriptor
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
perror("Socket creation error");
exit(EXIT_FAILURE);
}
printf("....2\n");
memset(&servaddr, 0, sizeof(servaddr));
//Filling Server info
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = INADDR_ANY;
printf("....3\n");
int i=0;
//while(i<6){
int n, len, serlen;
serlen = sizeof(servaddr);
sendto(sockfd, (struct coap_packet *)&pkt, sizeof(pkt), 0, (const struct sockaddr *)&servaddr, sizeof(servaddr));
printf("....4\n");
// sendto(sockfd, (const char *)hello, strlen(hello), MSG_CONFIRM, (const struct sockaddr *)&servaddr, sizeof(servaddr));
// send(sockfd, hello, strlen(hello), 0);
// send(sockfd, (struct coap_packet *)pkt, 50, 0);
printf("Packet Sent.\n");
n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *)&servaddr, &serlen);
// n = read(sockfd, (char *)buffer, MAXLINE);
buffer[n] = '\0';
printf("Server: %s\n", buffer);
i+=1;
//}
close(sockfd);
return 0;
}
现在的问题是,在服务器端打印的值与我在客户端分配的值不同。
例如:
在客户端,我分配了 pkt-> hdr.id = 1002 ;
但是在服务器端, temp->。id 的值不同,并且正在打印一些随机数。 pkt-> hdr.code (在客户端上)和 temp-> hdr.code (在服务器上)
这是输出的屏幕截图: