色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

c 模擬post json接受不到

林雅南1年前6瀏覽0評論

最近在開發中使用c語言模擬post json接收功能,但是遇到了一個非常棘手的問題:json數據無法被成功接收。通過不斷的排查,最終找到了問題所在。

/* 部分代碼 */
char postData[1024] = "{\"name\":\"test\",\"age\":20}";
char header[1024] = "Content-Type: application/json\r\nContent-Length: 29\r\n\r\n";
int clientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(8080);
connect(clientSock, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
send(clientSock, header, strlen(header), 0);
send(clientSock, postData, strlen(postData), 0);

接收端的代碼如下:

/* 部分代碼 */
char recvData[1024] = {0};
recv(clientSock, recvData, 1024, 0);
printf("%s\n", recvData);

上述接收端代碼是有問題的,因為接收到的數據中包含了請求頭,導致json數據無法被正確解析。正確的接收端代碼應該如下:

/* 部分代碼 */
char buffer[1024] = {0};
int recvLen = 0;
int jsonStart = -1;
while ((recvLen = recv(clientSock, buffer, 1024, 0)) >0)
{
for (int i = 0; i< recvLen; i++)
{
if (buffer[i] == '{')
{
jsonStart = i;
break;
}
}
if (jsonStart != -1)
{
printf("%s\n", buffer + jsonStart);
break;
}
}

上述代碼通過循環接收數據,并找到json數據的起始位置,從而正確解析json數據。

通過這次經歷,讓我明白了在使用c語言模擬post json數據時,需要注意接收端的代碼實現,避免重復接收請求頭導致json數據無法被解析。