使用套接字从c调用RESTAPI
我有一个程序,我试图调用亚马逊的RESTAPI使用套接字从c调用RESTAPI,c,sockets,rest,C,Sockets,Rest,我有一个程序,我试图调用亚马逊的RESTAPI int main() { char * serveraddr = "myuser.s3.amazonaws.com"; int iProtocolPort = 0; char szSmtpServerName[64] = ""; char szBuffer[4096] = ""; char szMsgLine[1024]
int main()
{
char * serveraddr = "myuser.s3.amazonaws.com";
int iProtocolPort = 0;
char szSmtpServerName[64] = "";
char szBuffer[4096] = "";
char szMsgLine[1024] = "";
SOCKET hServer;
WSADATA WSData;
LPHOSTENT lpHostEntry;
LPSERVENT lpServEntry;
SOCKADDR_IN SockAddr;
// Load command-line args
lstrcpyA(szSmtpServerName, serveraddr);
// Attempt to intialize WinSock (1.1 or later)
if(WSAStartup(WINSOCK_VERSION, &WSData))
{
return 1;
}
// Lookup email server's IP address.
lpHostEntry = gethostbyname(szSmtpServerName);
if(!lpHostEntry)
{
cout << "Cannot find SMTP mail server " << szSmtpServerName << endl;
return 1;
}
// Create a TCP/IP socket, no specific protocol
hServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(hServer == INVALID_SOCKET)
{
cout << "Cannot open mail server socket" << endl;
return 1;
}
// Use the HTTP default port if no other port is specified
iProtocolPort = htons(80);
// Setup a Socket Address structure
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = iProtocolPort;
SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
// Connect the Socket
if(connect(hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
{
cout << "Error connecting to Server socket" << endl;
printf("Last error = %d\n",WSAGetLastError());
return 1;
}
int content_len = 0;
char *query=NULL;
char * tpl = (char *)"POST /test.txt?uploads HTTP/1.1\r\nHost: %s\r\n"
"Authorization: AWS ABCDEFDGHIJKLMN:%s\r\n"
"Date: %s\r\n\r\n";
//Get Time stamp
char *currdate = currentDateTime();
char *sign = NULL;
char signString [32]= {0};
//Generate sign string
int ret = GenedateSignature(&sign,currdate);
memcpy(signString,sign,28);
query = (char *)malloc(512*(sizeof(char )));
if(query == NULL)
{
LogMessage(LOG_FILE,"\nQuery == NULL \n");
return FALSE;
}
memset(query,0,512);
content_len=0;//strlen((char*)Status);
sprintf(query, tpl, (char*)serveraddr,signString,currdate);
//Send data
int r = send(hServer, query, strlen(query), 0);
//Recv data
recv(hServer, szBuffer, sizeof(szBuffer), 0);
printf("\n%s",szBuffer);
free(query);
// Close server socket and prepare to exit.
closesocket(hServer);
WSACleanup();
return 0;
}
intmain()
{
char*serveraddr=“myuser.s3.amazonaws.com”;
int iProtocolPort=0;
char szSmtpServerName[64]=“”;
字符szBuffer[4096]=“”;
char szMsgLine[1024]=“”;
套接字服务器;
WSADATA-WSData;
LPHOSTENT lpHostEntry;
LPSERVENT LPSERVENT;
SOCKADDR_在SOCKADDR中;
//加载命令行参数
lstrcpyA(szSmtpServerName,serveraddr);
//尝试初始化WinSock(1.1或更高版本)
if(WSAStartup(WINSOCK_版本和WSData))
{
返回1;
}
//查找电子邮件服务器的IP地址。
lpHostEntry=gethostbyname(szSmtpServerName);
如果(!lpHostEntry)
{
API的东西看起来还可以吗(尽管可能有一些细微的错误?)但是您确实应该检查send
和recv
的返回值。它可能只发送了您的一半数据!test.txt上的POST应该做什么?您是否检查了文件是否存在?类似的调用在其他编程语言或工具中是否有效?