gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:30:21 25 4
gpt4 key购买 nike

我想向“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com