#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "cJSON.h"
//#include "cJSON_Utils.h"
#pragma comment(lib, "cjson.lib")
#define DEFAULT_PORT 10000
#define MAXLINE 4096
//ͨÐÅÐÒéÊý×é
char tcp_flag[4069];
char cmd_type[5];
char data_len[5];
int cmd__;
int len__;
char buff__[1024];
char data[4069];
char *send_data;
int socket_fd, connect_fd;
struct sockaddr_in servaddr;
char buff[4096] = {0};
char sendBuf[4069];
int n;
char *cmd_tcp;
char *len_tcp;
//ÕûÐÍתΪ×Ö·ûÐÍ
char *intToBytes(int num) {
int i;
char *tt=(char*)malloc(sizeof(int) + 1);
for (i = 0; i < 4; ++i) {
int offset = 32 - (i + 1) * 8;
tt[i] = (char) ((num >> offset) & 0xff);
// printf("%d--",tt[i]);
}
return tt;
free(tt);
tt=NULL;
}
//×Ö·ûÐÍתΪÕûÐÍ
int bytesToInt(char bytes[]) {
int num = 0,i;
for (i = 0; i < 4; ++i) {
num <<= 8;
num |= (bytes[i] & 0xff);
}
return num;
}
//解析数据
//»ñÈ¡¿Í»§¶Ë´«¹ýÀ´µÄÊý¾Ý
void parse_data(char buff[]){
//»ñÈ¡¿Í»§¶Ë´«¹ýÀ´µÄÊý¾Ý
int k,t;
for(k=0; k<4; k++) tcp_flag[k] = buff[k];
for(k=4; k<8; k++) cmd_type[k-4] = buff[k];
for(k=8; k<12; k++) data_len[k-8] = buff[k];
//½âÎöÊý¾Ý
cmd__ = bytesToInt(cmd_type);
len__ = bytesToInt(data_len);
for(t=0; t<len__; t++) data[t] = buff[k++];
printf(" data_parse :%s\n", data);
}
//×Ö·ûת»»º¯Êý
void toBuff(){
cmd_tcp=(char*)malloc(sizeof(int) + 1);
len_tcp=(char*)malloc(sizeof(int) + 1);
cmd_tcp=intToBytes(cmd__);
len_tcp=intToBytes(len__);
}
//·¢Ëͺ¯Êý
void response_msg(){
send(connect_fd, tcp_flag, 4,0);
send(connect_fd, cmd_tcp, 4,0);
send(connect_fd, len_tcp, 4,0);
send(connect_fd, send_data, strlen(send_data),0);
}
//½âÎöjsonÏûÏ¢,Ï൱ÓÚÈ¡³ö¸ø¶¨¼üÖµ¶ÔÖеÄkey,´Ó¶ø°ÑÏàÓ¦µÄֵȡ³öÀ´£¬×¢ÒâºÃÆäÖеIJã´Î¹Øϵ
/*
¿Í»§¶ËÌṩµÄjsonÊý¾Ý£º
{"name":"zms", "age":"43", "country":"china"}
*/
char *json_parse(char recv_data[])
{
printf("recv_data1 : %s\n", recv_data);
char *json_data = (char*)malloc(strlen(recv_data));
cJSON *json = cJSON_Parse(recv_data);
if (json != NULL)
{
printf("test2 : %s\n", recv_data);
//È¡³öÕâ¸öÈ˵Äname,²¢´æ´¢ÆðÀ´
cJSON *temp = cJSON_GetObjectItem(json, "name");
if(temp != NULL)
printf("name : %s\n",temp->valuestring );
char *name = temp->valuestring;
//È¡³öage,²¢´æ´¢ÆðÀ´£¬valuestringµÄÉùÃ÷Ϊ char* valuestring
temp = cJSON_GetObjectItem(json, "age");
if (temp != NULL)
printf("age : %s\n",temp->valuestring );
char *age = temp->valuestring;
//È¡³öcountry,²¢´æ´¢ÆðÀ´
temp = cJSON_GetObjectItem(json, "country");
if (temp != NULL)
printf("country : %s\n", temp->valuestring);
char *country = temp->valuestring;
//°ÑÈ¡µ½µÄname¡¢age¡¢country×Ö·û´®Æ´½Óµ½json_data
int i = 0,j=0;
while (i < strlen(name))
{
json_data[j++] = name[i++];
}
i = 0;
while (i < strlen(age))
{
json_data[j++] = age[i++];
}
i = 0;
while (i < strlen(country))
{
json_data[j++] = country[i++];
}
}
cJSON_Delete(json);
json = NULL;
printf("json_data:%s\n",json_data);
return json_data;
}
int main()
{
send_data = (char*)malloc(4069);
//³õʼ»¯Socket
if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//³õʼ»¯
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IPµØÖ·ÉèÖóÉINADDR_ANY,ÈÃϵͳ×Ô¶¯»ñÈ¡±¾»úµÄIPµØÖ·¡£
servaddr.sin_port = htons(DEFAULT_PORT);//ÉèÖõĶ˿ÚΪDEFAULT_PORT
//½«±¾µØµØÖ·°ó¶¨µ½Ëù´´½¨µÄÌ×½Ó×ÖÉÏ
if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//¿ªÊ¼¼àÌýÊÇ·ñÓпͻ§¶ËÁ¬½Ó
if( listen(socket_fd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("waiting for client's request\n");
while(1){
//×èÈûÖ±µ½Óпͻ§¶ËÁ¬½Ó£¬²»È»¶àÀË·ÑCPU×ÊÔ´¡£
if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1)
{
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
n = recv(connect_fd, buff, MAXLINE, 0);
printf(" buff1 : %s\n",buff);
while (n){
parse_data(buff);
printf(" len__1 :%d\n", len__);
printf(" data1 :%s\n", data);
switch(cmd__){
//ÇëÇóÁ¬½ÓÏìÓ¦
case 0:
toBuff(); //°ÑintÀàÐÍתΪ4×Ö½ÚÊý
send_data[0]='2';//Êý¾ÝΪ 1 or 2 ±íʾ¼ÓÃÜ»ò²»¼ÓÃÜ
send_data[1]='\0';
response_msg();//ÏìÓ¦¿Í»§¶ËµÄÐÅÏ¢
buff[0] = '\0';
n = 0;
int n3 = 0;
n = recv(connect_fd, buff, MAXLINE, 0);
parse_data(buff);
printf(" n2 : %d \n",n);
printf(" len__2 :%d\n", len__);
printf("buff2: %s\n", buff);
if(n < (len__+12)){
int tt = 12, ii = 0;
n3 = recv(connect_fd, buff__, MAXLINE, 0);
printf(" n3 : %d\n", n3);
printf("buff3: %s\n", buff__);
for(; ii < len__; ii++){buff[tt++] = buff__[ii];}
parse_data(buff);
}
break;
//¶Ï¿ª
case 1:;break;
//xmlÏûÏ¢ÏìÓ¦
case 2:;break;
//jsonÏûÏ¢ÏìÓ¦
case 3:
printf("case 30000\n\n");
toBuff();
send_data = json_parse(data);
response_msg();
buff[0] = '\0';
buff__[0] = '\0';
n = 0;
break;
//ͼƬÎļþÏìÓ¦
case 4:;break;
//ÆäËûÎļþÏìÓ¦
case 5:;break;
//urlÏìÓ¦
case 6:;break;
}
}
//²âÊÔÊý¾Ý
// printf("cmd__-----: %d\n",cmd__);
//printf("len__-----: %d\n",len__);
//printf("buff--: %s\n",buff);
//²âÊÔsprintfº¯Êý
//char cmd_tcp[14],data_sec='2';
//int j;
//j=sprintf(cmd_tcp,"%c%c%c%c%d%d%d%d%d%d%d%d",buff[0],buff[1],buff[2],buff[3],buff[4],buff[5],buff[6],buff[7],buff[8],buff[9],buff[10],buff[11],buff[12]);
//j+=sprintf(cmd_tcp+j,"%c",data_sec);
//ÉêÇëÄÚ´æ¿Õ¼ä½«intÐÍÊý¾ÝÃüÁî¼°³¤¶Èת»»Îª×Ö·ûÐͲ¢´æ´¢
//ÏìÓ¦Êý¾ÝΪ1/2£»1Ϊ²»¼ÓÃÜ£¬2Ϊ¼ÓÃÜ
//½øÐÐ×Ö·û´®Æ´½Ó
// link(tcp_flag,cmd_tcp);
//link(tcp_flag,len_tcp);
//link(tcp_flag,data);
//char aa[5]="0004";
//link(tcp_flag,aa);
//printf("testtesttest: %s\n", tcp_flag);
//Ïò¿Í»§¶Ë·¢ËÍ»ØÓ¦Êý¾Ý
//if(!fork()){
// if((send(connect_fd, tcp_flag, 13,0)) == -1)
// perror("send error");
// close(connect_fd);
// exit(0);
// }
close(connect_fd);
}
close(socket_fd);
}
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "cJSON.h"
//#include "cJSON_Utils.h"
#pragma comment(lib, "cjson.lib")
#define DEFAULT_PORT 10000
#define MAXLINE 4096
//ͨÐÅÐÒéÊý×é
char tcp_flag[4069];
char cmd_type[5];
char data_len[5];
int cmd__;
int len__;
char buff__[1024];
char data[4069];
char *send_data;
int socket_fd, connect_fd;
struct sockaddr_in servaddr;
char buff[4096] = {0};
char sendBuf[4069];
int n;
char *cmd_tcp;
char *len_tcp;
//ÕûÐÍתΪ×Ö·ûÐÍ
char *intToBytes(int num) {
int i;
char *tt=(char*)malloc(sizeof(int) + 1);
for (i = 0; i < 4; ++i) {
int offset = 32 - (i + 1) * 8;
tt[i] = (char) ((num >> offset) & 0xff);
// printf("%d--",tt[i]);
}
return tt;
free(tt);
tt=NULL;
}
//×Ö·ûÐÍתΪÕûÐÍ
int bytesToInt(char bytes[]) {
int num = 0,i;
for (i = 0; i < 4; ++i) {
num <<= 8;
num |= (bytes[i] & 0xff);
}
return num;
}
//解析数据
//»ñÈ¡¿Í»§¶Ë´«¹ýÀ´µÄÊý¾Ý
void parse_data(char buff[]){
//»ñÈ¡¿Í»§¶Ë´«¹ýÀ´µÄÊý¾Ý
int k,t;
for(k=0; k<4; k++) tcp_flag[k] = buff[k];
for(k=4; k<8; k++) cmd_type[k-4] = buff[k];
for(k=8; k<12; k++) data_len[k-8] = buff[k];
//½âÎöÊý¾Ý
cmd__ = bytesToInt(cmd_type);
len__ = bytesToInt(data_len);
for(t=0; t<len__; t++) data[t] = buff[k++];
printf(" data_parse :%s\n", data);
}
//×Ö·ûת»»º¯Êý
void toBuff(){
cmd_tcp=(char*)malloc(sizeof(int) + 1);
len_tcp=(char*)malloc(sizeof(int) + 1);
cmd_tcp=intToBytes(cmd__);
len_tcp=intToBytes(len__);
}
//·¢Ëͺ¯Êý
void response_msg(){
send(connect_fd, tcp_flag, 4,0);
send(connect_fd, cmd_tcp, 4,0);
send(connect_fd, len_tcp, 4,0);
send(connect_fd, send_data, strlen(send_data),0);
}
//½âÎöjsonÏûÏ¢,Ï൱ÓÚÈ¡³ö¸ø¶¨¼üÖµ¶ÔÖеÄkey,´Ó¶ø°ÑÏàÓ¦µÄֵȡ³öÀ´£¬×¢ÒâºÃÆäÖеIJã´Î¹Øϵ
/*
¿Í»§¶ËÌṩµÄjsonÊý¾Ý£º
{"name":"zms", "age":"43", "country":"china"}
*/
char *json_parse(char recv_data[])
{
printf("recv_data1 : %s\n", recv_data);
char *json_data = (char*)malloc(strlen(recv_data));
cJSON *json = cJSON_Parse(recv_data);
if (json != NULL)
{
printf("test2 : %s\n", recv_data);
//È¡³öÕâ¸öÈ˵Äname,²¢´æ´¢ÆðÀ´
cJSON *temp = cJSON_GetObjectItem(json, "name");
if(temp != NULL)
printf("name : %s\n",temp->valuestring );
char *name = temp->valuestring;
//È¡³öage,²¢´æ´¢ÆðÀ´£¬valuestringµÄÉùÃ÷Ϊ char* valuestring
temp = cJSON_GetObjectItem(json, "age");
if (temp != NULL)
printf("age : %s\n",temp->valuestring );
char *age = temp->valuestring;
//È¡³öcountry,²¢´æ´¢ÆðÀ´
temp = cJSON_GetObjectItem(json, "country");
if (temp != NULL)
printf("country : %s\n", temp->valuestring);
char *country = temp->valuestring;
//°ÑÈ¡µ½µÄname¡¢age¡¢country×Ö·û´®Æ´½Óµ½json_data
int i = 0,j=0;
while (i < strlen(name))
{
json_data[j++] = name[i++];
}
i = 0;
while (i < strlen(age))
{
json_data[j++] = age[i++];
}
i = 0;
while (i < strlen(country))
{
json_data[j++] = country[i++];
}
}
cJSON_Delete(json);
json = NULL;
printf("json_data:%s\n",json_data);
return json_data;
}
int main()
{
send_data = (char*)malloc(4069);
//³õʼ»¯Socket
if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//³õʼ»¯
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IPµØÖ·ÉèÖóÉINADDR_ANY,ÈÃϵͳ×Ô¶¯»ñÈ¡±¾»úµÄIPµØÖ·¡£
servaddr.sin_port = htons(DEFAULT_PORT);//ÉèÖõĶ˿ÚΪDEFAULT_PORT
//½«±¾µØµØÖ·°ó¶¨µ½Ëù´´½¨µÄÌ×½Ó×ÖÉÏ
if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//¿ªÊ¼¼àÌýÊÇ·ñÓпͻ§¶ËÁ¬½Ó
if( listen(socket_fd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("waiting for client's request\n");
while(1){
//×èÈûÖ±µ½Óпͻ§¶ËÁ¬½Ó£¬²»È»¶àÀË·ÑCPU×ÊÔ´¡£
if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1)
{
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
n = recv(connect_fd, buff, MAXLINE, 0);
printf(" buff1 : %s\n",buff);
while (n){
parse_data(buff);
printf(" len__1 :%d\n", len__);
printf(" data1 :%s\n", data);
switch(cmd__){
//ÇëÇóÁ¬½ÓÏìÓ¦
case 0:
toBuff(); //°ÑintÀàÐÍתΪ4×Ö½ÚÊý
send_data[0]='2';//Êý¾ÝΪ 1 or 2 ±íʾ¼ÓÃÜ»ò²»¼ÓÃÜ
send_data[1]='\0';
response_msg();//ÏìÓ¦¿Í»§¶ËµÄÐÅÏ¢
buff[0] = '\0';
n = 0;
int n3 = 0;
n = recv(connect_fd, buff, MAXLINE, 0);
parse_data(buff);
printf(" n2 : %d \n",n);
printf(" len__2 :%d\n", len__);
printf("buff2: %s\n", buff);
if(n < (len__+12)){
int tt = 12, ii = 0;
n3 = recv(connect_fd, buff__, MAXLINE, 0);
printf(" n3 : %d\n", n3);
printf("buff3: %s\n", buff__);
for(; ii < len__; ii++){buff[tt++] = buff__[ii];}
parse_data(buff);
}
break;
//¶Ï¿ª
case 1:;break;
//xmlÏûÏ¢ÏìÓ¦
case 2:;break;
//jsonÏûÏ¢ÏìÓ¦
case 3:
printf("case 30000\n\n");
toBuff();
send_data = json_parse(data);
response_msg();
buff[0] = '\0';
buff__[0] = '\0';
n = 0;
break;
//ͼƬÎļþÏìÓ¦
case 4:;break;
//ÆäËûÎļþÏìÓ¦
case 5:;break;
//urlÏìÓ¦
case 6:;break;
}
}
//²âÊÔÊý¾Ý
// printf("cmd__-----: %d\n",cmd__);
//printf("len__-----: %d\n",len__);
//printf("buff--: %s\n",buff);
//²âÊÔsprintfº¯Êý
//char cmd_tcp[14],data_sec='2';
//int j;
//j=sprintf(cmd_tcp,"%c%c%c%c%d%d%d%d%d%d%d%d",buff[0],buff[1],buff[2],buff[3],buff[4],buff[5],buff[6],buff[7],buff[8],buff[9],buff[10],buff[11],buff[12]);
//j+=sprintf(cmd_tcp+j,"%c",data_sec);
//ÉêÇëÄÚ´æ¿Õ¼ä½«intÐÍÊý¾ÝÃüÁî¼°³¤¶Èת»»Îª×Ö·ûÐͲ¢´æ´¢
//ÏìÓ¦Êý¾ÝΪ1/2£»1Ϊ²»¼ÓÃÜ£¬2Ϊ¼ÓÃÜ
//½øÐÐ×Ö·û´®Æ´½Ó
// link(tcp_flag,cmd_tcp);
//link(tcp_flag,len_tcp);
//link(tcp_flag,data);
//char aa[5]="0004";
//link(tcp_flag,aa);
//printf("testtesttest: %s\n", tcp_flag);
//Ïò¿Í»§¶Ë·¢ËÍ»ØÓ¦Êý¾Ý
//if(!fork()){
// if((send(connect_fd, tcp_flag, 13,0)) == -1)
// perror("send error");
// close(connect_fd);
// exit(0);
// }
close(connect_fd);
}
close(socket_fd);
}