diff --git a/common.h b/common.h index a4a45ac..7914ad0 100644 --- a/common.h +++ b/common.h @@ -85,7 +85,7 @@ struct ip_port_t typedef u64_t fd64_t; -const int max_data_len=1600; +const int max_data_len=1800; const int buf_len=max_data_len+400; u64_t get_current_time(); diff --git a/main.cpp b/main.cpp index 22ba2dd..10d7fd1 100755 --- a/main.cpp +++ b/main.cpp @@ -1294,12 +1294,18 @@ int client_event_loop() int recv_len; struct sockaddr_in udp_new_addr_in={0}; socklen_t udp_new_addr_len = sizeof(sockaddr_in); - if ((recv_len = recvfrom(udp_fd, buf, max_data_len, 0, + if ((recv_len = recvfrom(udp_fd, buf, max_data_len+1, 0, (struct sockaddr *) &udp_new_addr_in, &udp_new_addr_len)) == -1) { mylog(log_error,"recv_from error,this shouldnt happen at client\n"); myexit(1); }; + if(recv_len==max_data_len+1) + { + mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len); + continue; + } + if(recv_len>=mtu_warn) { mylog(log_warn,"huge packet,data len=%d (>=%d).strongly suggested to set a smaller mtu at upper level,to get rid of this warn\n ",recv_len,mtu_warn); @@ -1639,10 +1645,16 @@ int server_event_loop() int fd=fd_manager.to_fd(fd64); - int recv_len=recv(fd,buf,max_data_len,0); + int recv_len=recv(fd,buf,max_data_len+1,0); mylog(log_trace,"received a packet from udp_fd,len:%d\n",recv_len); + if(recv_len==max_data_len+1) + { + mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len); + continue; + } + if(recv_len<0) { mylog(log_debug,"udp fd,recv_len<0 continue,%s\n",strerror(errno)); diff --git a/network.cpp b/network.cpp index 3c2181a..3c00a3f 100644 --- a/network.cpp +++ b/network.cpp @@ -704,7 +704,13 @@ int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen) struct sockaddr_ll saddr={0}; socklen_t saddr_size = sizeof(saddr); int flag=0; - int recv_len = recvfrom(raw_recv_fd, recv_raw_ip_buf, max_data_len, flag ,(sockaddr*)&saddr , &saddr_size); + int recv_len = recvfrom(raw_recv_fd, recv_raw_ip_buf, max_data_len+1, flag ,(sockaddr*)&saddr , &saddr_size); + + if(recv_len==max_data_len+1) + { + mylog(log_warn,"huge packet, data_len > %d,dropped\n",max_data_len); + return -1; + } if(recv_len<0) {