带有xml转发的select非阻塞,修正了一个错误

修改部分在transfer.c第288行,修改如下
ptr = conns[m].totalBuffer;
conns[m].edSize = 0;//-----------------------



同一文件,这样修改貌似可以减少提示出现的不是utf-8字符串的问题。
79 content[target->XmlLength+1] = '/0';//about utf-8
printf("content:%s\n",content);



tcp_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <linux/in.h>
#include <errno.h>
#include <sys/select.h>
#include <string.h>
#include <memory.h>
#include <fcntl.h>

#include "transfer.h"
#include "xmlproc.h"

#define PORT 8886
#define recvcontent_size 300

int swap;
int nullElement;
char content[300];//œÓÊÕÄÚÈÝ»ºŽæ

void process_conn_server(int s);
int getNullElement();
void resetElement(int argum);


int main(int argc, char *argv[])
{
	struct targetPack *targetSS = (struct targetPack *)malloc(sizeof(struct targetPack));
	int ss,sc;
	int err;
	int addrlen;
		int maxsock;


		
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;  

	ss = socket(AF_INET,SOCK_STREAM,0);
	
	int flags = fcntl(ss, F_GETFL, 0); 
	fcntl(ss, F_SETFL, flags | O_NONBLOCK);
	
	if(ss<0)
	{
		perror("socket");
		return -1;
	}

	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(PORT);

	int opt = 1; 
	setsockopt(ss,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); 


	err = bind(ss, (struct sockaddr *) &server_addr, sizeof(server_addr));
	if(err<0)
	{
		perror("bind");
		return -1;
	}

	err = listen(ss, 5);
	if(err < 0)
	{
		perror("listen");
		return -1;
	}
	

	addrlen = sizeof(struct sockaddr);

	int l;
	for(l=0;l<50;l++)
	{
		conns[l].clientfd = 0;
		conns[l].recverfd = 0;
		conns[l].edSize = 0;
		memset(conns[l].totalBuffer,0,total_buf_size);
	}

	int clientCounter;
	clientCounter = 0;
	maxsock = ss;
		
	for(;;)
	{
		int ret, err;
		fd_set clientS,clientR;
		struct timeval tv;



		FD_ZERO(&clientS);
		FD_ZERO(&clientR);
		FD_SET(ss,&clientS);
		
		tv.tv_sec = 2;
		tv.tv_usec = 0;

		int n;
		for(n=0;n<50;n++)
		{
			if(conns[n].clientfd != 0)
			{
				FD_SET(conns[n].clientfd, &clientS);
			}
			if(conns[n].recverfd!= 0)
			{
				FD_SET(conns[n].recverfd, &clientR);
			}
		}



		ret = select(maxsock+1, &clientS, &clientR, 0, &tv);
		switch(ret)
		{
			case -1:
				perror("select");
				break;
			case 0:
				perror("timeout");
				break;
			default:
				if(FD_ISSET(ss,&clientS))
				{
					nullElement = getNullElement();
					printf("Accept:%d\n",nullElement);
					conns[nullElement].clientfd = accept(ss,(struct sockaddr *)&client_addr,&addrlen);
					if(conns[nullElement].clientfd == -1)
					{
						perror("accept");
					}
					else if(conns[nullElement].clientfd == 0)
					{
						printf("accept return 0\n");	
					}
					else if(conns[nullElement].clientfd > 0)
					{
						//FD_SET(conns[nullElement].clientfd,&clientS);
						//FD_SET(conns[nullElement].clientfd,&clientR);
						printf("accept return value:%d\n",conns[nullElement].clientfd);
						printf("nullElementvalue:%d\n",nullElement);
						if(maxsock<conns[nullElement].clientfd)
							maxsock = conns[nullElement].clientfd;

						clientCounter++;
				
					}
				}	

				int m;
				for(m=0; m<50; m++)
				{
					if(conns[m].clientfd == 0) continue;	
					if(FD_ISSET(conns[m].clientfd, &clientS))
					{
						printf("client %d is changed\n", conns[m].clientfd);
						printf("Maxsock is %d\n",maxsock);
												
						memset(targetSS,'\0',sizeof(struct targetPack));
							printf("*************************seek1\n");
						memset(content,0,300);
						recvFromClient(m, targetSS, &conns[m].recverfd, content);
						printf("content server.c:%s\n",content);
							printf("*************************seek2\n");
							sleep(1);
					}	

					if(FD_ISSET(conns[m].recverfd,&clientR))
					{
						sendToClientXML2(m,targetSS, content);						
						afterSendProc(m);
					}
					
				}
			}
			
				
	}
        return 0;
}


int getNullElement()
{
	int j;
	for(j=0;j<50;j++)
	{
		if(conns[j].clientfd == 0)
			{
			swap = j;
			break;
			}
	}
	printf("swap:%d",swap);
	return swap;	
}

void resetElement(int argum)
{
	conns[argum].clientfd = 0;
	conns[argum].edSize = 0;
	memset(conns[argum].totalBuffer,0,1024);
}





tcp_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <linux/in.h>
#include <net/if.h>

#include "transfer.h"
#include "xmlproc.h"

#define PORT 8886
#define CONTENT_SIZE 100 //max size 300

void process_conn_client(int s);

int main(int argc, char *argv[])
{
	int s;
	int err;
	struct sockaddr_in server_addr;

	if(argc!=2)
	  {
		fprintf(stderr,"Usage:./client <IP_Address>\n");
		return -1;
          }
	  
	s = socket(AF_INET,SOCK_STREAM,0);
	if(s < 0){
	    perror("socket");
	    return -1;
	}

	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(PORT);

        inet_pton(AF_INET, argv[0], &server_addr.sin_addr);
	
	err = connect(s, (struct sockaddr *) &server_addr, sizeof(struct sockaddr));
	if(err < 0)
	{
	  perror("connect");
	  return -1;
	}	
	
	for(;;)
	{
		process_conn_client(s);
	}
	
	close(s);
	return 0;
}


void process_conn_client(int s)
{
	int recv_id;
	printf("Type in the socket fd:\n");
	scanf("%d",&recv_id);
	char content[200];
	printf("Type in the content:\n");
	read(1,content,200);
	sendTotalBuferToServer(s, recv_id, content);
	printf("TEST");	
	struct targetPack *trgt = (struct targetPack *)malloc(sizeof(struct targetPack));
	recvFromServer(s, trgt);
	sleep(2);
}


transfer.c

#include "transfer.h"
#define swap_buf_size 500


struct pipePack *pipe_pack;
struct targetPack *target_pack;

ssize_t sendP(int fd, const void *buf, size_t num, int flag)    
{    
	ssize_t res;    
	size_t n;    
	const char *ptr;    
	    
	    
	n = num;    
	ptr = buf;    
	while (n > 0) 
	{    
		if ((res = send(fd, ptr, n, flag)) <= 0) 
		{    
	      		if (errno == EINTR)    
	       		res = 0;    
	      		else    
	       	return (-1);    
	      }    
	    
	     ptr += res;
	     n -= res;    
	}        
	return (num);    
} 


ssize_t recvP (int fd, void *buf, size_t num, int flag)    
{    
	ssize_t res;    
	size_t n;    
	char *ptr;    
	    
	    
	n = num;    
	ptr = buf;    
	while (n > 0) 
	{    
	     	if ((res = recv (fd, ptr, n, flag)) == -1) 
		{    
		      if (errno == EINTR)    
			      res = 0;    
			else    
				return (-1);    
	     	}    
	      else if (res == 0)
		  	break;    
		  
	    ptr += res;    
	    n -= res;    
	}    	    
	return (num - n);    
}    


void recvFromServer(int s, struct targetPack *target)
{
	char temBuffer[1024];
	memset(temBuffer,0,1024);
	memset(target,0,sizeof(struct targetPack));
	
	recvP(s, temBuffer, 1024, 0);
	memcpy(target,temBuffer,sizeof(struct targetPack));
	char xmlbuf[500];
	memset(xmlbuf,0,500);
	memcpy(xmlbuf,temBuffer+sizeof(struct targetPack), target->XmlLength);
	generateTimeFile("GetServerTimeResponse.xml",xmlbuf);
	rtnSerTime("GetServerTimeResponse.xml");
	char content[500];
	memset(content,0,500);
	memcpy(content, temBuffer+sizeof(struct targetPack)+target->XmlLength, 1024-sizeof(struct targetPack)-target->XmlLength);
	content[target->XmlLength+1] = '/0';//about utf-8
	printf("content:%s\n",content);
}



/*
* 2nd
* 1st edition, non block send a targetPack structure to server, 
* the 2 edition will append the xml proccess
* Append comment: the 1st edition is missing.
*/
void sendTotalBuferToServer(int n, int recvID, char *str)
{	
	struct targetPack *tgt = (struct targetPack *)malloc(sizeof(struct targetPack));
	char senbuf[total_buf_size];
	;
	int testn = recvID;
	char ss[20];
	sprintf(ss,"%d",testn);

	char content[50];
	sprintf(content,"%s",str);
	char *xml_file_name = creatClientXmlFd(ss, content);
	char *xml_str = rtnXmlBuf(xml_file_name);
	tgt->XmlLength = strlen(xml_str);
	printf("Xml file length:%d\n",tgt->XmlLength);

	//initialize the totalbuffer of pipePack structure
	memset(senbuf,0,total_buf_size);
	memcpy(senbuf,tgt,target_buf_size);
	memcpy(senbuf+border_size, xml_str, tgt->XmlLength);

	int send_size;
	send_size = 0;
	send_size = sendP(n, senbuf, total_buf_size, 0);
	printf("send size:%d\n",send_size);
}	


/*
*send a structure to clients,
*first argument is conns struct array coordinate,
*second argument is a pointer to targetPack structure.
*the template is sendToClient();  Ïò¿Í»§¶Ë·¢ËÍ°üÍ·ºÍʱŒäxmlÎÄŒþ
*/
void sendToClientXML(int m, struct targetPack *swap)
{
	char *xml_file_name = creatServerXml();
	char *xml_str = rtnXmlBuf(xml_file_name);
	swap->XmlLength = strlen(xml_str);
	
	
	memset(conns[m].totalBuffer,0,total_buf_size);
	memcpy(conns[m].totalBuffer, swap, sizeof(struct targetPack));
	memcpy(conns[m].totalBuffer+border_size, xml_str, strlen(xml_str)+1);

	int sendsize;
	int totalsize;
	char *ptr;
	sendsize = 0;
	totalsize = 1024;
	conns[m].edSize = 0;
	ptr = conns[m].totalBuffer;
	
	for(;;)
	{
		sendsize = send(conns[m].recverfd, ptr, 1024-conns[m].edSize,MSG_DONTWAIT);
		if(sendsize > 0)
		{
			ptr += sendsize;
			conns[m].edSize += sendsize;
			printf("send %d bytes\n",sendsize);
		}
		else if(sendsize == 0)
		{
			printf("following the sendsize %d bytes\n", sendsize);
		}
		
		if(conns[m].edSize >= 1024)
		{
			printf("send finish\n");
			break;
		}
	}
}


/*
*send a structure to clients,
*first argument is conns struct array coordinate,
*second argument is a pointer to targetPack structure.
*the template is sendToClient();  Ïò¿Í»§¶Ë·¢ËÍ°üÍ·ºÍʱŒäxmlÎÄŒþ
*/
void sendToClientXML2(int m, struct targetPack *swap, char *content)
{
	char *xml_file_name = creatServerXml();
	char *xml_str = rtnXmlBuf(xml_file_name);
	swap->XmlLength = strlen(xml_str);
	
	
	memset(conns[m].totalBuffer,0,total_buf_size);
	memcpy(conns[m].totalBuffer, swap, sizeof(struct targetPack));
	memcpy(conns[m].totalBuffer+border_size, xml_str, strlen(xml_str));
	memcpy(conns[m].totalBuffer+border_size+strlen(xml_str), content, recvcontent_size);

	int sendsize;
	int totalsize;
	char *ptr;
	sendsize = 0;
	totalsize = 1024;
	conns[m].edSize = 0;
	ptr = conns[m].totalBuffer;
	
	for(;;)
	{
		sendsize = send(conns[m].recverfd, ptr, 1024-conns[m].edSize,MSG_DONTWAIT);
		if(sendsize> 0)
		{
			ptr += sendsize;
			conns[m].edSize += sendsize;
			printf("send %d bytes\n",sendsize);
		}
		else if(sendsize < 0) 
		{    
	            if(errno == EAGAIN) 
	            {    
	                errno=0;
			   printf("errno == EAGAIN");
			   break;
	            }
	            else
	            {    
	                perror("recv");    
	               // exit(EXIT_FAILURE);    
	            }    
		}
		else if(sendsize = 0)
		{
			printf("client has discontent\n");
			break;
		}   

		
		if(conns[m].edSize >= 1024)
		{
			printf("send finish\n");
			break;
		}
	}
}


/*
*send a structure to clients,
*first argument is conns struct array coordinate,
*second argument is a pointer to targetPack structure.
*/
void sendToClient(int m, struct targetPack *swap)
{
	int sendsize;
	int totalsize;
	char *ptr;
	sendsize = 0;
	totalsize = 1024;
	conns[m].edSize = 0;
	ptr = conns[m].totalBuffer;

	memset(conns[m].totalBuffer,0,total_buf_size);
	memcpy(conns[m].totalBuffer, swap, sizeof(struct targetPack));
	for(;;)
	{
		sendsize = send(conns[m].clientfd, ptr, 1024-conns[m].edSize,MSG_DONTWAIT);
		if(sendsize> 0)
		{
			ptr += sendsize;
			conns[m].edSize += sendsize;
			printf("send %d bytes\n",sendsize);
		}
		else
		{
			printf("following the sendsize %d bytes\n", sendsize);
		}
		
		if(conns[m].edSize >= 1024)
		{
			printf("send finish\n");
			break;
		}
	}
	
}




/*
*µÚÒ»žö²ÎÊýÊǜṹÌåÊý×é×ø±ê£¬µÚ¶þžö²ÎÊýÊÇÄ¿±êœá¹¹Ìå
*µÚÈýžö²ÎÊýÊÇÊÇŽÓxmlÎÄŒþÖÐÌáÈ¡µÄœÓÊÕÕßsockFD,
*µÚËÄžö²ÎÊýÊÇŽÓxml ÖÐÌáÈ¡¿Í»§¶Ë·¢ËÍÄÚÈÝ¡£
*/
void recvFromClient(int m, struct targetPack *ss, int *testint, char *content)
{
	int recvsize;
	int totalsize;
	char *ptr;
	totalsize = 1024;
	ptr = conns[m].totalBuffer;
	conns[m].edSize = 0;		
	memset(ss,0,sizeof(struct targetPack));
	//memset(conns[m].totalBuffer,0,1024);

	for(;;)
	{
		recvsize = 0;
		recvsize = recv(conns[m].clientfd, ptr, totalsize-conns[m].edSize, MSG_DONTWAIT);
		if(recvsize > 0)
		{	
			ptr += recvsize;
			conns[m].edSize += recvsize;
			printf("Received %d bytes\n",recvsize);
		}
		else if(recvsize < 0) 
		{
	            if(errno == EAGAIN) 
	            {    
	                errno=0;
					printf("errno == EAGAIN");	
					break;    
	            }
	            else
	            {    
	                perror("recv");    
	                exit(EXIT_FAILURE);    
	            }    
		}
		else if(recvsize = 0)
		{
			printf("client has discontent\n");
			break;
		}   

		
		if(conns[m].edSize >= border_size)
		{
			memcpy(ss, conns[m].totalBuffer, sizeof(struct targetPack));
			printf("xml length is %d\n", ss->XmlLength);
			
			if((conns[m].edSize - border_size) > (ss->XmlLength))
			{
				char xmlstr[900];
				memset(xmlstr,'\0',900);
				memcpy(xmlstr, conns[m].totalBuffer+border_size,ss->XmlLength);
				char *file_name = "xmlFileFromClient.xml";
				generateTimeFile(file_name, xmlstr);
	
				char xmlbuf[300];
				getFDandContent(file_name, testint, xmlbuf);
				printf("content from client xml:\n%s\n", xmlbuf);
				sprintf(content, "%s", xmlbuf);
				conns[m].recverfd = *testint;
			}
			
		}
		else if(conns[m].edSize < 0)
		{
			printf("conns[m].edSize < 0: %d\n", conns[m].edSize);
			break;
		}
	}
}


void afterSendProc(int coo)
{
	conns[coo].recverfd = 0;
	memset(conns[coo].totalBuffer, 0, total_buf_size);
}


void getStructFromPipe(struct pipePack conns[i], struct targetPack *tgt)
{
	char bufferTem[500];
	memset(bufferTem,0,500);
	memcpy(bufferTem,conns[i].totalBuffer,sizeof(struct targetPack));
	memcpy(tgt,bufferTem,sizeof(struct targetPack));
}



















transfer.h

#ifndef TRANSFER
#define TRANSFER

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <linux/in.h>
#include <errno.h>
#include <sys/select.h>
#include <string.h>
#include <memory.h>
#include <errno.h>

#include "xmlproc.h"


#define total_buf_size 1024
#define target_buf_size 300
#define pipes_num 50
#define border_size sizeof(struct targetPack)
#define recvcontent_size 300

struct pipePack
{
	int clientfd;
	int recverfd;
	char totalBuffer[total_buf_size];
	int edSize;
};

struct targetPack
{
	__u32 HeadMagic;
	__u32 Seq;
	__u32 XmlLength;
	__u32 total_packets;
	char packet_no;
	char reserve[2];
};

int i;
struct pipePack conns[pipes_num];


ssize_t sendP(int fd, const void *buf, size_t num, int flag);
ssize_t recvP (int fd, void *buf, size_t num, int flag);
void getStructFromPipe(struct pipePack conns[i], struct targetPack *tgt);
void recvFromClient(int m, struct targetPack *ss, int *testint, char *content);
void sendToClient(int m, struct targetPack *swap);
void sendTotalBuferToServer(int n, int recvID, char *str);
void recvFromServer(int s, struct targetPack *target);
void sendToClientXML2(int m, struct targetPack *swap, char *content);
void afterSendProc(int coo);

#endif


xmlproc.h

#include "xmlproc.h"


char *creatServerXml()
{	
//	remove("GetServerTimeResponse.xml");
	char *xmlFileName = "GetServerTimeResponse.xml";
	struct tm *ptr;
	time_t t;
	t = time(NULL);
	ptr = gmtime(&t); 
	char *ss = ctime(&t);
	xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
	xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"message");
	xmlNewProp(root_node,BAD_CAST"type",BAD_CAST"GetServerTimeResponse");
	xmlDocSetRootElement(doc,root_node);
	xmlNodePtr serverNm = xmlNewNode(NULL,BAD_CAST"serverTime");
	xmlNodePtr serverCt = xmlNewText(BAD_CAST ss);
	xmlAddChild(root_node,serverNm);
	xmlAddChild(serverNm,serverCt);
	int nRel = xmlSaveFile(xmlFileName,doc);
	/*
	if(nRel != -1)
	{
		printf("The XML file GetServerTimeResponse.xml has been created with %d bytes.\n",nRel);
	}
	*/
	xmlFreeDoc(doc);
	return xmlFileName;
}

char *creatClientXml()
{
//	remove("GetServerTime.xml");
	char *xmlFileName = "GetServerTime.xml";
	xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
	xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"message");
	xmlNewProp(root_node,BAD_CAST"type",BAD_CAST"GetServerTime");
	xmlDocSetRootElement(doc,root_node);

	xmlNodePtr clientNm = xmlNewNode(NULL,BAD_CAST"clientName");
	xmlNodePtr clientCt = xmlNewText(BAD_CAST"jxj");
	xmlAddChild(root_node,clientNm);
	xmlAddChild(clientNm,clientCt);
	
	int nRel = xmlSaveFile(xmlFileName,doc);
	/*
	if(nRel != -1)
	{
		printf("GetServerTime.xml file has been created with %d bytes.\n",nRel);
	}
	*/
	xmlFreeDoc(doc);
	return xmlFileName;
}


/*
*ŽËº¯ÊýÊÇcreateClientXmlµÄ±äÌ壬µÚÒ»žö²ÎÊýÊÇœÓÊÕ·œÌלÓ×ÖÃèÊö·û
*
*/
char *creatClientXmlFd(char *str, char *content)
{
//	remove("GetServerTime.xml");
	char *xmlFileName = "GetServerTime.xml";
	xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
	xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"message");
	xmlNewProp(root_node,BAD_CAST"type",BAD_CAST"GetServerTime");
	xmlDocSetRootElement(doc,root_node);

	xmlNodePtr clientNm = xmlNewNode(NULL,BAD_CAST"clientName");
	xmlNodePtr clientCt = xmlNewText(BAD_CAST"jxj");
	xmlAddChild(root_node,clientNm);
	xmlAddChild(clientNm,clientCt);

	xmlNodePtr clientNmfd = xmlNewNode(NULL,BAD_CAST"recverFD");
	xmlNodePtr clientCtfd = xmlNewText(BAD_CAST str);
	xmlAddChild(root_node,clientNmfd);
	xmlAddChild(clientNmfd,clientCtfd);

	xmlNodePtr clientNmContent= xmlNewNode(NULL,BAD_CAST"content");
	xmlNodePtr clientCtContent = xmlNewText(BAD_CAST content);
	xmlAddChild(root_node,clientNmContent);
	xmlAddChild(clientNmContent,clientCtContent);
	
	int nRel = xmlSaveFile(xmlFileName,doc);
	/*
	if(nRel != -1)
	{
		printf("GetServerTime.xml file has been created with %d bytes.\n",nRel);
	}
	*/
	xmlFreeDoc(doc);
	return xmlFileName;
}



/**
*·µ»ØÎÄŒþÃû×ÖΪµÚÒ»žö²ÎÊýµÄÄÚÈÝ×Ö·ûŽ®
*
*/
char *rtnXmlBuf(char * str)
{
	FILE *cltXml;
	char *xmlFileName = str;
	cltXml = fopen(xmlFileName,"r");
	char swap[2];
	size_t n = 1;
	swap[0] = fgetc(cltXml);
        memset(target,0,strlen(target)); 
	swap[1] = '\0';
	while(swap[0] != EOF)
	{
		strncat(target,swap,n);
		swap[0] = fgetc(cltXml);
	}
	int tarSize = strlen(target);
	target[tarSize] = '\0';
	/* printf("test:%s\n",target);*/
	fclose(cltXml);
	return target;
}


/*
*ŽÓbufÖеõœÒ»xmlµÄ×Ö·ûŽ®£¬Éú³ÉÃûΪfilenameµÄxmlÎÄŒþ
*
*/
void generateTimeFile(char *fileName, char *buf)
{		
	FILE *fp;
//	remove(fileName);
	if((fp = fopen(fileName,"w")) == NULL)
	{	
		printf("Create the Xml File failed!\n");
	}
	
	char *ss = buf;
	int filebuf_size = strlen(ss)+1;	
	char filebuf[filebuf_size];	
	sprintf(filebuf,"%s",ss);	

	int buf_size;
	//buf_size = strlen(filebuf);

	fputs(ss, fp);
	fclose(fp);
}


/*
*ŽÓÀŽÖÁ·þÎñÆ÷¶ËµÄxmlÎÄŒþÖÐÈ¡µÃµ±Ç°Ê±Œä
*
*/
char *rtnSerTime(char *fileNMStr)
{
	xmlDocPtr doc;
	xmlNodePtr curNode;
	xmlChar *szKey;
	char *szDocName = fileNMStr;

	doc = xmlReadFile(szDocName,"",XML_PARSE_RECOVER);
	if(NULL == doc)
	{
		printf("Document parsed successful!\n");
	}
	

	curNode = xmlDocGetRootElement(doc);
	if(NULL == curNode)
	  {
		fprintf(stderr,"empty document!\n");
		xmlFreeDoc(doc);
	  }
	if(xmlStrcmp(curNode->name,BAD_CAST"message"))
		{	
			fprintf(stderr,"document of the wrong type,roo != message");
			xmlFreeDoc(doc);
		}

	curNode = curNode->xmlChildrenNode;
	xmlNodePtr propNodePtr = curNode;
	if(curNode != NULL)
	{
		
        if(!xmlStrcmp(curNode->name,(const xmlChar*)"serverTime"))
		{	
			szKey = xmlNodeGetContent(curNode);
			printf("The server time:%s\n",szKey);
			xmlFree(szKey);
		}  
	}
	xmlFreeDoc(doc);
}




/*
*ÀàËÆÓërtnbuftime º¯Êý£¬²ÎÊý2ºÍ²ÎÊý3 ÊÇÌáÈ¡ŽÓ¿Í·þ¶ËµÃµœxml ÖÐœÓÊÕÕß
* idºÍÄÚÈÝ
*/
char *getFDandContent(char *fileNMStr, int *sockfd, char *str)
{
	xmlDocPtr doc;
	xmlNodePtr curNode;
	xmlChar *szKey;
	xmlChar *fdKey;
	xmlChar *cntKey;
	
	char *szDocName = fileNMStr;

	doc = xmlReadFile(szDocName,"",XML_PARSE_RECOVER);
	if(NULL == doc)
	{
		printf("Document parsed successful!\n");
	}
	

	curNode = xmlDocGetRootElement(doc);
	if(NULL == curNode)
	  {
		fprintf(stderr,"empty document!\n");
		xmlFreeDoc(doc);
	  }
	if(xmlStrcmp(curNode->name,BAD_CAST"message"))
		{	
			fprintf(stderr,"document of the wrong type,roo != message");
			xmlFreeDoc(doc);
		}

	curNode = curNode->xmlChildrenNode;
	xmlNodePtr propNodePtr = curNode;
	if(curNode != NULL)
	{
          	if(!xmlStrcmp(curNode->name,(const xmlChar*)"serverTime"))
		{	
			szKey = xmlNodeGetContent(curNode);
			printf("The server time:%s\n",szKey);
		}
	}

	curNode = curNode->next;
	if(curNode != NULL)
	{
          	if(!xmlStrcmp(curNode->name,(const xmlChar*)"recverFD"))
		{	
			szKey = xmlNodeGetContent(curNode);
			printf("The xmk recvID:%s\n",szKey);
			*sockfd = atoi(szKey);
			//printf("The xmk recvID int:%d\n",*sockfd);
		}
	}	

	curNode = curNode->next;
	if(curNode != NULL)
	{
          	if(!xmlStrcmp(curNode->name,(const xmlChar*)"content"))
		{	
			szKey = xmlNodeGetContent(curNode);
			//printf("The xmk content:%s\n",szKey);
			sprintf(str,"%s",szKey);
		}
	}	
	xmlFree(szKey);
	xmlFreeDoc(doc);
}


xmlproc.h

#ifndef __XMLPROC__
#define __XMLPROC__

#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <time.h>
#include <memory.h>

char target[1024];

char *rtnSerTime(char *fileNMStr);
void generateTimeFile(char * fileName, char * buf);
char *rtnXmlBuf(char * str);
char *creatClientXml();
char *creatServerXml();
char *creatClientXmlFd(char *str, char *content);

#endif



Makefile

all:client server

client: tcp_client.o transfer.o xmlproc.o
	cc -lxml2 -o client tcp_client.o transfer.o xmlproc.o

server: tcp_server.o transfer.o xmlproc.o
	cc -lxml2 -o server tcp_server.o transfer.o xmlproc.o

tcp_server.o:tcp_server.c
	cc -I /usr/include/libxml2 -c -o tcp_server.o tcp_server.c

tcp_client.o:tcp_client.c 
	cc -I /usr/include/libxml2 -c -o tcp_client.o tcp_client.c

transfer.o:transfer.c transfer.h
	cc -I /usr/include/libxml2 -c -o transfer.o transfer.c

xmlproc.o:xmlproc.c xmlproc.h
	cc -I /usr/include/libxml2 -c -o xmlproc.o xmlproc.c

clean:
	rm -f client server *.o *.xml



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值