C語言是一種廣泛使用的編程語言,適用于開發各種類型的應用程序。在網絡編程方面,C語言也有著出色的表現,能夠實現各種協議和網絡功能。本文將介紹如何使用C語言編寫服務端,接收并處理POST JSON請求。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
const int MAXLINE = 4096;
const int PORT = 8888;
const int LISTENQ = 10;
// 處理POST請求
void do_post(int sockfd, char* recvline) {
char method[MAXLINE], path[MAXLINE], version[MAXLINE];
sscanf(recvline, "%s %s %s", method, path, version);
// 讀取請求頭
char headerline[MAXLINE];
while (1) {
if (read(sockfd, headerline, MAXLINE)<= 0)
return;
if (strcmp(headerline, "\r\n") == 0)
break;
}
// 讀取請求體
char content[MAXLINE];
if (read(sockfd, content, MAXLINE)<= 0)
return;
// 處理JSON
printf("Recv JSON From Client:\n%s\n", content);
// TODO: 在此處對JSON進行處理
}
int main(int argc, char** argv) {
int listenfd, connfd;
struct sockaddr_in servaddr, clientaddr;
socklen_t clientlen = sizeof(clientaddr);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd< 0) {
perror("socket error");
exit(1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))< 0) {
perror("bind error");
exit(1);
}
if (listen(listenfd, LISTENQ)< 0) {
perror("listen error");
exit(1);
}
printf("Server is running on port %d...\n", PORT);
while (true) {
connfd = accept(listenfd, (struct sockaddr*)&clientaddr, &clientlen);
if (connfd< 0) {
perror("accept error");
continue;
}
char recvline[MAXLINE];
if (read(connfd, recvline, MAXLINE)<= 0)
continue;
// 判斷是否是POST請求
if (strncmp(recvline, "POST", 4) == 0) {
do_post(connfd, recvline);
}
close(connfd);
}
return 0;
}
在本文中,我們創建了一個名為main的函數,該函數啟動了一個端口為8888的socket服務端,等待客戶端連接。當客戶端連接時,我們首先讀取客戶端發送的request請求。如果是POST請求,我們調用do_post函數來處理請求。
do_post函數繼續讀取請求頭和請求體,并在控制臺打印接收到的JSON字符串。在此處,開發者可以利用各種JSON庫來解析和處理JSON數據。
上述代碼僅為示例代碼,請根據自己的實際編程需求進行修改和優化。祝大家編程愉快!