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; }
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; }
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); }
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 }
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 }
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 ; }
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; }