客户端和服务器端的结构值不同

时间:2018-12-17 22:51:43

标签: udp c sockets

我试图通过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 (在服务器上)

这是输出的屏幕截图:

screenshot

0 个答案:

没有答案