Push-сообщение на push-сервере Samsung Tizen с использованием C, winsock (windows) - PullRequest
0 голосов
/ 06 июля 2018

Я хочу отправлять сообщения на «push-сервер Samsung Tizen».

Я сделал ту же программу, используя C #, WebRequest. Программа работает очень хорошо.

Сейчас я делаю ту же программу на C. Но программа, кажется, не взаимодействует должным образом.

Это исходный код программы на C #.

private string SendTizenPushServer()
{
    string resultStr;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://apkorea.push.samsungosp.com:8090/spp/pns/api/push");
    request.Method = "POST";
    request.ContentType = "application/json;charset=utf-8;";
    request.Headers.Add(string.Format("appID:xxxMy_appIDxxx"));
    request.Headers.Add(string.Format("appSecret:xxxMy_appSecretxxx"));
    var postData = new {
        regID = "xxxMy_regIDxxx",
        requestID = "0000001",
        message = "alertMessage=Hi",
    };

    string contentMsg = JsonConvert.SerializeObject(postData);
    Debug.WriteLine("contentMsg = " + contentMsg);

    Byte[] byteArray = Encoding.UTF8.GetBytes(contentMsg);
    request.ContentLength = byteArray.Length;

    Stream dataStream = request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();

    try
    {
        WebResponse response = request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        resultStr = reader.ReadToEnd();
        Debug.WriteLine("response: " + resultStr);
        reader.Close();
        responseStream.Close();
        response.Close();
    }
    catch (Exception e)
    {
        resultStr = "";
        Debug.WriteLine(e.Message);
    }
}

Результат работы этой программы:

"{\"results\":[{\"regID\":\"xxxMy_regIDxxx\",\"requestID\":\"0000001\",\"statusCode\":1000,\"statusMsg\":\"Success\"}]}"

И оборудование Tizen также получило данные как обычно.

Моя проблема в программе на Си. Это исходный код моей программы на C, использующий winsock2.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>

#pragma comment(lib, "ws2_32.lib")

#define MAXLINE 4096

SSIZE_T SendTizenPushServer()
{
    // newtwork value
    char sendData[MAXLINE + 1], recvData[MAXLINE + 1], data[MAXLINE + 1];
    SSIZE_T n;
    WSADATA wsaData;
    SOCKET fcmSocket;
    struct hostent *hostent;
    SOCKADDR_IN sockAddr;

    // samsung push server host name
    char *hname = "apkorea.push.samsungosp.com";

    // network setting
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("WSAStartup failed.\n");
        return 0;
    }
    if ((hostent = gethostbyname(hname)) == NULL) 
    {
        printf("gethostbyname error for host: %s:",hname);
        return 0;
    }
    fcmSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (fcmSocket == INVALID_SOCKET)
    {
        printf("Socket failed.\n");
        return 0;
    }
    memset(&sockAddr, 0, sizeof(sockAddr));
    sockAddr.sin_family = PF_INET;
    sockAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)*hostent->h_addr_list));
    sockAddr.sin_port = htons(8090);

    if (connect(fcmSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)
    {
        printf("Connect failed.\n");
        return 0;
    }

    sprintf(data,
        "{\"regID\":\"xxxMy_regIDxxx\","
        "\"requestID\":\"00000001\","
        "\"message\":\"alertMessage=Hi\""
        "}\r\n");

    sprintf(sendData,
        // Header 
        "POST /spp/pns/api/push HTTP/1.1\r\n"
        "appID: xxxMy_appIDxxxx\r\n"
        "appSecret: xxxxMy_appSecretxxxx\r\n"
        "Host: %s:8090\r\n"
        "Content-Type: application/json\r\n"
        "Content-Length: %d\r\n\r\n"
        // Data
        "%s", hname, strlen(data), data);

    printf("send data : \n%s\n\n", sendData);

    send(fcmSocket, sendData, strlen(sendData), 0);

    while ((n = recv(fcmSocket, recvData, MAXLINE, 0)) > 0)
    {
        recvData[n] = '\0';
        printf("recv : %s\n\n", recvData);
    }

    closesocket(fcmSocket);
    WSACleanup;

    return n;
}

Нет ответа при запуске программы. Нет даже ответа об ошибке.

Если appID или RegID были неправильными, я получил сообщение, что это неправильно в программе на C #. Но в программе на Си нет ответа.

В чем проблема? Пожалуйста, помогите мне. T.T

1 Ответ

0 голосов
/ 10 июля 2018

Полагаю, вы уже тщательно проверили это руководство.

Руководство по серверу push-уведомлений

Я добавляю некоторые контрольные списки с моей стороны, может быть, вам поможет.

1) Записать / распечатать «окончательный JSON-запрос на отправку» из кода C #.Также зарегистрируйте / распечатайте «окончательный запрос JSON для отправки» из кода C.И сравните их по буквам.(Полагаю, вы, возможно, уже делали это несколько раз)

2) Создайте локальный сервер и отправьте на него запрос из кода C # и C.Таким образом, вы можете убедиться, что оба кода работают с одним и тем же телом / конфигом запроса.

3) Поскольку имеется длинный список Обработка кодов ошибок , и вы не получаете ни одного из них,вероятность того, что сервер Tizen Push не подвергается воздействию вашего сервера при использовании кода C.

...