Exemple #1
0
int recvLine(SOCKET sock, char* buffer, int buffSize) { //функция приема сообщения
    char* buff = buffer; //указатель на начало внешнего буфера
    char* currPosPointer; //указатель для работы со временным буфером
    int count = 0; //число прочитанных символов (без удаления из буфера сокета)
    char tempBuf[100]; //временный буфер для приема
    char currChar; //текущий анализируемый символ (ищем разделитель)
    int tmpcount = 0;
    while (--buffSize > 0){
        if (--count <= 0) {
            recvn(sock, tempBuf, tmpcount);
            count = recv(sock, tempBuf, sizeof (tempBuf), MSG_PEEK);
            if (count <= 0) { return count; }
            currPosPointer = tempBuf;
            tmpcount = count;
        }
        currChar = *currPosPointer++;
        *buffer++ = currChar;
        if (currChar == '\n') {
            *(buffer - 1) = '\0';
            recvn(sock, tempBuf, tmpcount - count + 1);
            return buffer - buff-1;
        }
    }
    return -1;
}
Exemple #2
0
int recv_file_data(int newSocket, char directory[]){
	struct message_s data_message;
	FILE * fb;
	char correct_type = 0xFF;
	fb = fopen(directory, "wb");
	if (fb != NULL){
		do {
			if (recvn(newSocket, (char *)&data_message, sizeof(struct message_s)) == -1){
				printf("failed to receive.\n");
				exit(-1);
			}
			if (data_message.type != correct_type){
				printf("Error: Server - Incorreft type\n");
				exit(-1);
			}

			fwrite(data_message.payload, 1, data_message.length-12, fb);

		} while ( data_message.status != 0 );
		fclose(fb);
	}
	else{
		printf("Cannot write file.\n");
		exit(-1);
	}
	return 0;
}
// 데이터 받기
DWORD WINAPI ReadThread(LPVOID arg)
{
	SOCKET sock = (SOCKET)arg;
	CHATMSG chatmsg;
	DRAWMSG drawmsg;
	int type;
	int retval;

	while(1){
		retval = recvn(sock, (char *)&type, sizeof(type), 0);
		if(retval == 0 || retval == SOCKET_ERROR){
			break;
		}

		if(type == CHATTING){
			retval = recvn(sock, chatmsg.buf, sizeof(g_chatmsg.buf), 0);
			if(retval == 0 || retval == SOCKET_ERROR)
				break;
			DisplayText("[받은 메시지] %s\r\n", chatmsg.buf);
		}

		else if(type == DRAWING){
			retval = recvn(sock, (char *)&drawmsg, sizeof(drawmsg), 0);
			if(retval == 0 || retval == SOCKET_ERROR)
				break;
			SendMessage(hDrawWnd, WM_DRAWIT,
				MAKEWPARAM(drawmsg.x0, drawmsg.y0), 
				MAKELPARAM(drawmsg.x1, drawmsg.y1));
		}
	}

	// closesocket()
	closesocket(sock);

	return 0;
}
Exemple #4
0
void client_handle(psession_t ps)
{

	socket_t fd_client = ps -> sess_sfd ;
	int cmd_len = 0 ;
	int recv_ret ;
	while(1 )
	{
		bzero(ps -> sess_buf, BUF_SIZE);
		recv_ret = recv(fd_client, &cmd_len, sizeof(int),0);
		if(cmd_len == 0 || recv_ret == 0)
		{
			printf("client exit !\n");
			close(ps ->sess_sfd);
			free(ps);
			exit(1);
		}
		recvn(fd_client, ps->sess_buf, cmd_len);
		if(strncmp("cd", ps ->sess_buf, 2) == 0)
		{
			do_cd(ps);
		}else if(strncmp("ls", ps ->sess_buf, 2) == 0)
		{
			do_ls(ps);
		}else if( strncmp("puts", ps ->sess_buf, 4)== 0)
		{
			do_puts(ps);
		}else if( strncmp("gets", ps ->sess_buf, 4)== 0)
		{
			do_gets(ps);

		}else if( strncmp("remove", ps ->sess_buf, 6)== 0)
		{
			do_remove(ps);

		}else if(strncmp("pwd", ps ->sess_buf, 3) == 0) 
		{
			do_pwd(ps);

		}else 
		{
			continue ;
		}


	}
}
void handle_request(int sfd)
{
	show(sfd);
	char target_file[128] = "" ;
	char full_path[256] = "" ;
	int len ;
	recv(sfd, &len, 4, 0);
	recvn(sfd, target_file, len);
	printf("down file: %s\n", target_file);
	sprintf(full_path, "%s/%s", DOWN_PATH, target_file);
	
	FILE* fp = fopen(full_path, "r");
	if(fp == NULL)
	{
		perror("fopen");
		len = -1 ;
		send(sfd, &len, 4, 0);
		close(sfd);
		return ;
	}
	len = 1 ;
	send(sfd, &len, 4, 0);
	char msg[1024] ;
	while(memset(msg, 0, 1024), fgets(msg, 1024, fp) != NULL)
	{
		len = strlen(msg);
		send(sfd, &len, 4, 0);

		sendn(sfd, msg, len);
	}
	len = 0 ;
	send(sfd, &len, 4, 0);

	close(sfd);

}
Exemple #6
0
void BaseServer::StartRecv()
{
	fd_set recvfds;
	int result = 0;
	struct timeval timeout;
	timeout.tv_sec = 5;
	timeout.tv_usec = 0;

	while(1)
	{
		FD_ZERO(&recvfds);
		recvfds = m_setClntSock;
		result = select(m_iClntMaxSock+1,&recvfds,NULL,NULL,&timeout);
		if(result > 0)
		{
			pthread_mutex_lock(&m_mutxSock);
			for(int i=0;i<m_iClntCount;i++)
			{
				if(FD_ISSET(m_ClntSocks[i].sockfd,&recvfds))
				{
					m_ClntSocks[i].lasttime = time(NULL);
					char* buf = new char[MAXPACKLEN];
					memset(buf,0,MAXPACKLEN);
					int len = recvn(m_ClntSocks[i].sockfd,buf,4);
					if(len == 0)
					{
ClntDisConnect:
						ClntInfo temp;
						temp.sockfd = m_ClntSocks[i].sockfd;
						memcpy(temp.ipaddr,m_ClntSocks[i].ipaddr,16);
						FD_CLR(m_ClntSocks[i].sockfd,&m_setClntSock);

						for(int j = i;j < m_iClntCount-1;j++)
						{
							m_ClntSocks[j].sockfd = m_ClntSocks[j+1].sockfd;
							memcpy(m_ClntSocks[j].ipaddr,m_ClntSocks[j+1].ipaddr,16);
							m_ClntSocks[j].portno = m_ClntSocks[j+1].portno;
							m_ClntSocks[j].lasttime = m_ClntSocks[j+1].lasttime;
						}
						close(temp.sockfd);
						m_iClntCount--;
						i-=1;
#ifndef NO_DEBUG
						cout<<GetSystemTime()<<": Client Disconnected "<<temp.ipaddr<<endl;
#endif
					}
					else if(len > 0)
					{
						if(buf[0] == 0x44 && buf[1] == 0x46)
						{
							int buflen = *((int*)(buf+2));
							if(buflen > MAXPACKLEN-4)
							{
								cout<<GetSystemTime()<<": 数据包长超过最大值("<<dec<<MAXPACKLEN<<")."<<endl;
								g_logs.WriteLog(": 数据包长超过最大值(%d).",MAXPACKLEN);
							}
							len = recvn(m_ClntSocks[i].sockfd,buf+4,buflen+4);
							if(len > 0)
							{
								/* 加入任务到线程池,剩下的操作由线程池处理 */
								MyCTask* task = new MyCTask;
								task->setData(buf,m_ClntSocks[i],buflen+8);
#ifndef NO_DEBUG
								ostringstream temposs;
								temposs<<setfill('0')<<uppercase;
								for(int ii=0;ii<buflen+8;ii++)
								{
									temposs<<setw(2)<<hex<<static_cast<int>(buf[ii] & 0xFF)<<' ';
								}
								g_logs.WriteLog(" 已接收到报文(未解析) len:%d, message:%s",buflen+8,temposs.str().c_str());
#endif
								m_threadpool.AddTask(task);
							}
							else if(len == 0)
							{
								goto ClntDisConnect;
							}
							else
							{
#ifndef NO_DEBUG
								cout<<GetSystemTime()<<": Second recvn() error!"<<endl;
#endif
							}
						}
						else
						{
							ostringstream ossHead;
							ossHead<<setfill('0')<<uppercase;
							for(int k=0;k < len;k++)
							{
								ossHead << setw(2) << hex << static_cast<int>(buf[k]&0xFF) <<' ';
							}
							g_logs.WriteLog(": 包头错误:%s",ossHead.str().c_str());
						}
					}
					else
					{
#ifndef NO_DEBUG
						cout<<GetSystemTime()<<": First recvn() error!"<<endl;
#endif
					}
				}
				else
				{
					if(time(NULL) - m_ClntSocks[i].lasttime > TIMEOUT)
					{
						int sockfd;
						char tempaddr[16] = {0};
						sockfd = m_ClntSocks[i].sockfd;
						memcpy(tempaddr, m_ClntSocks[i].ipaddr, 16);
						FD_CLR(m_ClntSocks[i].sockfd,&m_setClntSock);

						for(int j = i;j < m_iClntCount-1;j++)
						{
							m_ClntSocks[j].sockfd = m_ClntSocks[j+1].sockfd;
							memset(m_ClntSocks[j].ipaddr, 0, 16);
							memcpy(m_ClntSocks[j].ipaddr, m_ClntSocks[j+1].ipaddr, 16);
							m_ClntSocks[j].portno = m_ClntSocks[j+1].portno;
							m_ClntSocks[j].lasttime = m_ClntSocks[j+1].lasttime;
						}
						close(sockfd);
						m_iClntCount--;
						i-=1;
						g_logs.WriteLog("%s 长时间无操作,主动断开连接.", tempaddr);
					}
				}
			}
			pthread_mutex_unlock(&m_mutxSock);
		}
		else if(result < 0)
		{
#ifndef NO_DEBUG
			cout<<GetSystemTime()<<":Recv select() error!"<<endl;
#endif
		}
	}//end of while
}
Exemple #7
0
void BaseServer::StartTrans(int port)
{
	m_ServTransSock.sockfd = Listen(port);
	m_ServTransSock.portno = port;

	if(m_ServTransSock.sockfd > 0){
		FD_SET(m_ServTransSock.sockfd,&m_setTransSock);
		if(m_iTransMaxSock < m_ServTransSock.sockfd)
			m_iTransMaxSock = m_ServTransSock.sockfd;
		cout<<GetSystemTime()<<": 转发端口 "<<dec<<port<<" 开启成功."<<endl;
	}
	else{
		cout<<GetSystemTime()<<": "<<port<<" 端口开启失败,程序退出."<<endl;
		exit(1);
	}

	int clnt_sock;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size = sizeof(clnt_addr);
	memset(&clnt_addr,0,sizeof(clnt_addr));
	
	fd_set tempsets;
	struct timeval timeout;
	timeout.tv_sec = 5;
	timeout.tv_usec = 0;
	int result = 0;
	size_t buflen = MAXPACKLEN;
	char buf[MAXPACKLEN] = {0};
	
	while(true)
	{
		FD_ZERO(&tempsets);
		tempsets = m_setTransSock;
		result = select(m_iTransMaxSock+1,&tempsets,NULL,NULL,&timeout);
		if(result > 0)
		{
			if(FD_ISSET(m_ServTransSock.sockfd,&tempsets))
			{
				clnt_sock = accept(m_ServTransSock.sockfd,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
				if(clnt_sock != -1)
				{
					pthread_mutex_lock(&m_mutxTransSock);
					if(m_bIsConn){
						FD_CLR(m_ClntTransSock.sockfd,&m_setTransSock);
						close(m_ClntTransSock.sockfd);
					}
					m_ClntTransSock.sockfd = clnt_sock;
					FD_SET(m_ClntTransSock.sockfd,&m_setTransSock);
					if(m_iTransMaxSock < m_ClntTransSock.sockfd)
						m_iTransMaxSock = m_ClntTransSock.sockfd;
					m_ClntTransSock.portno = m_ServTransSock.portno;
					memcpy(m_ClntTransSock.ipaddr,inet_ntoa(clnt_addr.sin_addr),16);
					m_bIsConn = true;
					m_threadpool.setTransInfo(m_ClntTransSock.sockfd,m_bIsConn);
					pthread_mutex_unlock(&m_mutxTransSock);
#ifndef NO_DEBUG
					cout<<GetSystemTime()<<": Trans Client Connected "<<m_ClntTransSock.ipaddr<<endl;
#endif
				}
			}
			if(m_bIsConn)
			{
				if(FD_ISSET(m_ClntTransSock.sockfd,&tempsets))
				{
					while(true)
					{
						pthread_mutex_lock(&m_mutxTransSock);	/*  */
						int len = recvn(m_ClntTransSock.sockfd,buf,buflen);
						memset(buf,0,buflen);
						if(len == 0)
						{
							FD_CLR(m_ClntTransSock.sockfd,&m_setTransSock);
							close(m_ClntTransSock.sockfd);
#ifndef NO_DEBUG
							cout<<GetSystemTime()<<": Trans Client DisConnect "<<m_ClntTransSock.ipaddr<<endl;
#endif
							m_bIsConn = false;
							m_threadpool.setTransInfo(0,m_bIsConn);
							break;
						}
						else if(len < 0)
						{
							break;
						}
					}
					pthread_mutex_unlock(&m_mutxTransSock);
				}
			}
		}
		else if(result < 0)
		{
#ifndef NO_DEBUG
			cout<<GetSystemTime()<<": Trans select() error!"<<endl;
#endif
		}
	}//end of while
}
Exemple #8
0
void BaseServer::StartWeb(int port)
{
	m_ServWebSock.sockfd = Listen(port);
	m_ServWebSock.portno = port;

	if(m_ServWebSock.sockfd > 0){
		FD_SET(m_ServWebSock.sockfd,&m_setWebSock);
		if(m_iWebMaxSock < m_ServWebSock.sockfd)
			m_iWebMaxSock = m_ServWebSock.sockfd;
		cout<<GetSystemTime()<<": Web交互端口 "<<dec<<port<<" 开启成功."<<endl;
	}
	else{
		cout<<GetSystemTime()<<": "<<port<<" 端口开启失败,程序退出."<<endl;
		exit(1);
	}

	int clnt_sock;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size = sizeof(clnt_addr);
	memset(&clnt_addr,0,sizeof(clnt_addr));
	
	fd_set tempsets;
	struct timeval timeout;
	timeout.tv_sec = 5;
	timeout.tv_usec = 0;
	int result = 0;
	size_t buflen = MAXPACKLEN;
	char buf[MAXPACKLEN] = {0};
	
	while(true)
	{
		FD_ZERO(&tempsets);
		tempsets = m_setWebSock;
		timeout.tv_sec = 5;
		timeout.tv_usec = 0;
		result = select(m_iWebMaxSock+1,&tempsets,NULL,NULL,&timeout);
		if(result > 0)
		{
			if(FD_ISSET(m_ServWebSock.sockfd,&tempsets))
			{
				clnt_sock = accept(m_ServWebSock.sockfd,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
				if(clnt_sock != -1)
				{
					if(m_bIsConnWeb){
						FD_CLR(m_ClntWebSock.sockfd,&m_setWebSock);
						close(m_ClntWebSock.sockfd);
					}
					m_ClntWebSock.sockfd = clnt_sock;
					FD_SET(m_ClntWebSock.sockfd,&m_setWebSock);
					if(m_iWebMaxSock < m_ClntWebSock.sockfd)
						m_iWebMaxSock = m_ClntWebSock.sockfd;
					m_ClntWebSock.portno = m_ServWebSock.portno;
					memcpy(m_ClntWebSock.ipaddr,inet_ntoa(clnt_addr.sin_addr),16);
					m_bIsConnWeb = true;
#ifndef NO_DEBUG
					cout<<GetSystemTime()<<": Web Client Connected "<<m_ClntWebSock.ipaddr<<endl;
#endif
				}
			}
			if(m_bIsConnWeb)
			{
				if(FD_ISSET(m_ClntWebSock.sockfd,&tempsets))
				{
					while(true)
					{
						memset(buf,0,buflen);
						int len = recvn(m_ClntWebSock.sockfd,buf,buflen);
						
						if(len == 6)
						{
							if((buf[0]&0xFF) == 0xAA && (buf[1]&0xFF) == 0xAA)
							{
								/********************添加获取站点信息及截止时间功能***************************/
								g_logs.WriteLog("收到采集数据截止日期更新命令.");
								pthread_mutex_lock(&m_infoMutex);
								iTimeSpace = GetConfigureFromDatabase();
								if(iTimeSpace == -1)
								{
									char space[4] = {0};
#ifndef NO_DEBUG									
									cout<<"获取数据库截止日期配置失败,从本地读取"<<endl;
#endif
									g_logs.WriteLog("获取数据库截止日期配置失败,从本地读取.");
									GetConfigureString("TIMESPACE",space,4,"30");
									iTimeSpace = atoi(space);
								}
								pthread_mutex_unlock(&m_infoMutex);
								cout<<"超过此截止天数的数据不再接收:"<<dec<<iTimeSpace<<" 天"<<endl;
								g_logs.WriteLog("超过此截止天数的数据不再接收:%d",iTimeSpace);
								/***************************************************** */
							}
						}
						else if(len == 0)
						{
							FD_CLR(m_ClntWebSock.sockfd,&m_setWebSock);
							close(m_ClntWebSock.sockfd);
							cout<<GetSystemTime()<<": Web Client DisConnect "<<m_ClntWebSock.ipaddr<<endl;
							m_bIsConnWeb = false;
							break;
						}
						else if(len < 0)
						{
							break;
						}
					}
				}
			}
		}
		else if(result < 0)
		{
			cout<<GetSystemTime()<<": Web select() error!"<<endl;
		}
	}
}
int main(int argc, char* argv[])//ip  port
{
	int fd_listen ;
	fd_listen = socket(AF_INET, SOCK_STREAM, 0);
	if(fd_listen == -1)
	{
		perror("socket");
		exit(1);
	}
	struct sockaddr_in seraddr ;

	memset(&seraddr, 0, sizeof(seraddr));

	seraddr.sin_family = AF_INET ;

	seraddr.sin_port = htons(atoi(argv[2]));

	seraddr.sin_addr.s_addr = inet_addr(argv[1]);

	if(-1 == bind(fd_listen, (struct sockaddr*)&seraddr, sizeof(seraddr)) )
	{
		perror("bind");
		close(fd_listen);
		exit(1);
	}

	if(-1 == listen(fd_listen, 10))
	{
		perror("listen");
		close(fd_listen);
		exit(1);
	}

	int fd_client ;
	struct sockaddr_in peeraddr ;
	socklen_t sock_len = sizeof(peeraddr) ;

	fd_client = accept(fd_listen, (struct sockaddr*)&peeraddr, &sock_len);

	printf("%s:%d connect!\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port) );
	int len ;
	char buf[1024] = "" ;
	while(1)
	{
		recv(fd_client, &len, 4, 0); 
		if(len == 0)
		{
			break ;
		}
		memset(buf, 0, sizeof(buf));
		recvn(fd_client, buf, len);
		printf("buf: %s: %d\n", buf, len);
	}



	close(fd_client);
	close(fd_listen);








	return 0 ;
}
Exemple #10
0
int main(int argc, char *argv[])
{
	int retval;

	// 윈속 초기화
	WSADATA wsa;
	if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
		return 1;

	// socket()
	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
	if(sock == INVALID_SOCKET) err_quit("socket()");

	// connect()
	SOCKADDR_IN serveraddr;
	ZeroMemory(&serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = AF_INET;
	//serveraddr.sin_addr.s_addr = inet_addr(SERVERIP);
	//serveraddr.sin_port = htons(SERVERPORT);

	auto ret = inet_pton(AF_INET, SERVERIP, (void *)&serveraddr.sin_addr.s_addr);
	serveraddr.sin_port = htons(SERVERPORT);

	retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
	if (retval == SOCKET_ERROR) {
		err_quit("connect()");
	}

	// 데이터 통신에 사용할 변수
	char buf[BUFSIZE+1];
	int len;

	// 서버와 데이터 통신
	while(1){
		// 데이터 입력
		printf("\n[보낼 데이터] ");
		if(fgets(buf, BUFSIZE+1, stdin) == NULL)
			break;

		// '\n' 문자 제거
		len = strlen(buf);
		if(buf[len-1] == '\n')
			buf[len-1] = '\0';
		if(strlen(buf) == 0)
			break;

		// 데이터 보내기
		retval = send(sock, buf, strlen(buf), 0);
		if(retval == SOCKET_ERROR){
			err_display("send()");
			break;
		}
		printf("[TCP 클라이언트] %d바이트를 보냈습니다.\n", retval);

		// 데이터 받기
		retval = recvn(sock, buf, retval, 0);
		if(retval == SOCKET_ERROR){
			err_display("recv()");
			break;
		}
		else if(retval == 0)
			break;

		// 받은 데이터 출력
		buf[retval] = '\0';
		printf("[TCP 클라이언트] %d바이트를 받았습니다.\n", retval);
		printf("[받은 데이터] %s\n", buf);
	}

	// closesocket()
	closesocket(sock);

	// 윈속 종료
	WSACleanup();
	return 0;
}
int main(int argc, char *argv[])
{
	int retval;

	// 윈속 초기화
	WSADATA wsa;
	if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
		return 1;

	// socket()
	SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
	if(listen_sock == INVALID_SOCKET) err_quit("socket()");

	// bind()
	SOCKADDR_IN serveraddr;
	ZeroMemory(&serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
	serveraddr.sin_port = htons(SERVERPORT);
	retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
	if(retval == SOCKET_ERROR) err_quit("bind()");

	// listen()
	retval = listen(listen_sock, SOMAXCONN);
	if(retval == SOCKET_ERROR) err_quit("listen()");

	// 데이터 통신에 사용할 변수
	SOCKET client_sock;
	SOCKADDR_IN clientaddr;
	int addrlen;
	char buf[BUFSIZE+1];
	int len;

	while(1){
		// accept()
		addrlen = sizeof(clientaddr);
		client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);
		if(client_sock == INVALID_SOCKET){
			err_display("accept()");
			break;
		}

		// 접속한 클라이언트 정보 출력
		printf("\n[TCP 서버] 클라이언트 접속: IP 주소=%s, 포트 번호=%d\n",
			inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

		// 클라이언트와 데이터 통신
		while(1){
			// 데이터 받기(고정 길이)
			retval = recvn(client_sock, (char *)&len, sizeof(int), 0);
			if(retval == SOCKET_ERROR){
				err_display("recv()");
				break;
			}
			else if(retval == 0)
				break;

			// 데이터 받기(가변 길이)
			retval = recvn(client_sock, buf, len, 0);
			if(retval == SOCKET_ERROR){
				err_display("recv()");
				break;
			}
			else if(retval == 0)
				break;

			// 받은 데이터 출력
			buf[retval] = '\0';
			printf("[TCP/%s:%d] %s\n", inet_ntoa(clientaddr.sin_addr),
				ntohs(clientaddr.sin_port), buf);
		}

		// closesocket()
		closesocket(client_sock);
		printf("[TCP 서버] 클라이언트 종료: IP 주소=%s, 포트 번호=%d\n",
			inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
	}

	// closesocket()
	closesocket(listen_sock);

	// 윈속 종료
	WSACleanup();
	return 0;
}