void on_read(int sock, short event, void *arg)
{
	//cout<<"on read"<<endl;
	struct user *puser = (struct user*)arg;
	//pthread_mutex_lock(&(puser->msg_lock));
	memset(puser->data, '\0',BUFFSIZE);
	int i = recv(sock, puser->data, 2, 0);
	if(i<0)
		return;
	short int len = *(short int*)(puser->data);
	len = ntohs(len);
	//cout<<"length of data:"<<len<<endl;
	memset(puser->data, '\0', BUFFSIZE);
	if((len < 0)||(len>1000000))
		return;

	puser->msg_len = recv(sock, puser->data, len, 0);
	
	if(puser->msg_len <= 0)
	{
		cout<<"a client disconnect"<<endl;
		if(puser->username != "")
		{
			cout<<"setsocket re:"<<setsocket(puser->username)<<endl;

		}
		event_free(puser->read_ev);
		event_free(puser->write_ev);
		//pthread_mutex_unlock(&(puser->msg_lock));
		pthread_mutex_destroy(&(puser->msg_lock));
		delete(puser);
		// close(sock);
	}

	while(puser->msg_len < len)
	{
		puser->msg_len += recv(sock,(puser->data)+(puser->msg_len),len-(puser->msg_len),0);
	}
	if(puser->msg_len == len)
	{
		datahandle(puser);
		//cout<<puser->data<<endl;
		//pthread_mutex_unlock(&(puser->msg_lock));
	}
	else
	{
		cout<<"resived data is error"<<endl;
		cout<<"serppose:"<<len<<endl;
		cout<<"real:"<<puser->msg_len<<endl;
		cout<<"data:"<<puser->data<<endl;
	}
}
Beispiel #2
0
int main()
{
    fd_set rs,ws,rfds,wfds;
    memset(u,'\0',sizeof(u));
    bzero(&rs, sizeof(fd_set));
    bzero(&ws, sizeof(fd_set));
    bzero(&rfds, sizeof(fd_set));
    bzero(&wfds, sizeof(fd_set));

    char teststr[]="h1=127.0.0.1&p1=8899&f1=t5.txt&h2=&p2=&f2=&h3=&p3=&f3=&h4=&p4=&f4=&h5=&p5=&f5=";
//    parser(teststr);
    parser(getenv("QUERY_STRING"));
    sendheader();
    setsocket(&rs,&ws);
    setselect(&rs,&ws,&rfds,&wfds);
//	sleep(10);
    return 0;
}