c - 使用C、winsock(windows)在三星Tizen推送服务器中推送消息

标签 c json push winsock tizen

我想向“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的C程序源代码。

#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# 程序中的错误。 但C程序没有任何反应。

有什么问题吗?请帮我。 TT

最佳答案

我希望您已经彻底检查了本指南。

Push Server Guide

我正在添加一些 list ,可能会有所帮助。

1) 从 C# 代码记录/打印“要发送的最终 JSON 请求”。 还从 C 代码记录/打印“要发送的最终 JSON 请求”。并逐个字母地比较它们。 (我猜你可能已经这样做过好几次了)

2) 创建本地服务器并将来自 C# 和 C 代码的请求发送到该服务器。通过这种方式,您可以确保两个代码都使用相同的请求正文/配置。

3) 因为 Handling Error Codes 有一个很长的列表并且您没有收到任何消息,有可能是在使用 C 代码时 Tizen 推送服务器没有被您的服务器命中。

关于c - 使用C、winsock(windows)在三星Tizen推送服务器中推送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51203925/

相关文章:

c - C 中的指针问题 - 我在这里做错了什么?

php - 将 json 数据传递到 smart suggest jquery 插件

json - Go 和 JSON : how to dynamically load a field

android - Firebase 创建推送两次 android

javascript - 如何将声明的函数插入数组并稍后调用它

c - Linux cc 项目内目录中的库编译?

c - 指向尚未声明的结构的指针

c++ - 无法编译 brian gladman aes 库

javascript - 如何获取JSON字符串的一部分?

iphone - 注册设备以在首次启动时推送通知