最近在開發中使用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數據無法被解析。
下一篇vue個性水印名字