Отправить структуру на сервер, используя UDP, почему сервер получает неправильный номер? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь отправить структуру на сервер, но когда я запускаю сервер, данные всегда равны нулю.

Вот определение структуры как на стороне клиента, так и на сервере:

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);
        }   
    }

Надеюсь на вашу помощь, заранее спасибо.

...