LINUX.ORG.RU

Не доходят пакеты до процесса


0

1

Здравствуйте!
Слушаю 5001 порт, сервер tcp на epoll,работал нормально для одного клиента в течениее двух месяцев, сейчас появилось больше и неожиданно процесс перестал принимать пакеты от клиентов (я перезагрузил его пару раз, день поробатал нормально), но при этом telnet запрос мой процесс обрабатывает и пакеты 100% отправляются, что может быть?

Заранее огромное спасибо!




# netstat -an | grep 5001
tcp 0 0 0.0.0.0:5001 0.0.0.0:* LISTEN
tcp 0 0 213.239.209.203:5001 213.87.137.123:43673 SYN_RECV
tcp 0 0 213.239.209.203:5001 213.87.128.115:53184 SYN_RECV
tcp 0 0 213.239.209.203:5001 213.87.137.123:26304 SYN_RECV
tcp 0 0 213.239.209.203:5001 213.87.137.123:62978 SYN_RECV
tcp 0 0 213.239.209.203:5001 213.87.137.123:64932 SYN_RECV
tcp 0 0 213.239.209.203:5001 213.87.128.115:9664 SYN_RECV
tcp 0 0 213.239.209.203:5001 213.87.128.115:18991 SYN_RECV

# tcpdump 'tcp port 5001' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
03:42:31.429846 IP 115.gprs.mts.ru.65161 > CentOS-55-32-minimal.commplex-link: S 1258107402:1258107402(0) win 8096 <mss 1024>
03:42:31.429865 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.65161: S 3669344669:3669344669(0) ack 1258107403 win 5840 <mss 1460>
03:42:32.309483 IP 115.gprs.mts.ru.65161 > CentOS-55-32-minimal.commplex-link: S 1356416333:1356416333(0) win 8096 <mss 1024>
03:42:32.309493 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.65161: . ack 1 win 5840
03:42:33.339177 IP 115.gprs.mts.ru.65161 > CentOS-55-32-minimal.commplex-link: S 1356416333:1356416333(0) win 8096 <mss 1024>
03:42:33.339185 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.65161: . ack 1 win 5840
03:42:34.362306 IP 115.gprs.mts.ru.65161 > CentOS-55-32-minimal.commplex-link: S 1356416333:1356416333(0) win 8096 <mss 1024>
03:42:34.362324 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.65161: . ack 1 win 5840
03:42:35.386049 IP 115.gprs.mts.ru.65161 > CentOS-55-32-minimal.commplex-link: S 1356416333:1356416333(0) win 8096 <mss 1024>
03:42:35.386058 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.65161: . ack 1 win 5840
03:42:35.718115 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.65161: S 3669344669:3669344669(0) ack 1258107403 win 5840 <mss 1460>
03:42:37.318199 IP CentOS-55-32-minimal.commplex-link > 123.gprs.mts.ru.64932: S 3627881603:3627881603(0) ack 626772209 win 5840 <mss 1460>
03:42:37.718218 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.18991: S 3563280275:3563280275(0) ack 845747839 win 5840 <mss 1460>
03:42:41.717428 IP CentOS-55-32-minimal.commplex-link > 115.gprs.mts.ru.65161: S 3669344669:3669344669(0) ack 1258107403 win 5840 <mss 1460>

14 packets captured
14 packets received by filter
0 packets dropped by kernel

код

int countDesq;
int sock;
epollListener net;
net.startListen(PORT);

while (1) {
countDesq = net.onWait();
for (int n = 0; n < countDesq; ++n) {

if (net.isNew(n)) {
sock = net.onConnect();
if (sock != -1) {
syslog(LOG_INFO, «new client on sock %d», sock);
}
}
if(net.isSendError(n)){
net.closeSocket(n);
syslog(LOG_INFO, «isSendError()», sock);
}
if(net.isSendData(n)){
sock=net.getSockFromEvents(n);
//обработываю пакет
Blocks.recieve(sock);
}
}
}





#Класс для работы с еполом:
class epollListener {
public:
epollListener();
virtual ~epollListener();
int onWait();
int onConnect();
int getSockFromEvents(int i);
void startListen(int port);
bool isNew(int i);
void Close();
bool isSendError(int i);
bool isSendData(int i);
void closeSocket(int i);
private:
struct sockaddr_in client_addr;
struct epoll_event ev, events[10000];
int sock, elDesq;
int initSocket();
void bindSocket(int port);
int listenSocket();
void initEpoll();
void setNonBlocking(int sock);


};



inline epollListener::epollListener() {

}

inline epollListener::~epollListener() {

}

inline int epollListener::initSocket() {
int lSock, sock;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
syslog(LOG_INFO, «sock(): %s», strerror(errno));
exit(0);
}
return sock;
}

inline void epollListener::bindSocket(int port) {
struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
if (bind(sock, (struct sockaddr *) &serv_addr,
sizeof (serv_addr)) < 0) {
syslog(LOG_INFO, «bind(): %s», strerror(errno));
exit(0);
}
}

inline int epollListener::listenSocket() {
int listen_sock = listen(sock, 1000);
if (listen_sock == -1) {
syslog(LOG_INFO, «listen(): %s», strerror(errno));
exit(0);
return listen_sock;
}
}

inline void epollListener::initEpoll() {
elDesq = epoll_create(10000);
if (elDesq == -1) {
syslog(LOG_INFO, «epoll_create((): %s», strerror(errno));
exit(EXIT_FAILURE);
}

ev.events = EPOLLIN;
ev.data.fd = sock;
if (epoll_ctl(elDesq, EPOLL_CTL_ADD, sock, &ev) == -1) {
syslog(LOG_INFO, «epoll_ctl(): %s», strerror(errno));
exit(EXIT_FAILURE);
}
}

inline void epollListener::startListen(int port) {
sock = initSocket();
syslog(LOG_INFO, «socket created»);
bindSocket(port);
syslog(LOG_INFO, «binded»);
listenSocket();
syslog(LOG_INFO, «listened»);
initEpoll();
syslog(LOG_INFO, «inited epoll»);
}

inline int epollListener::onWait() {
syslog(LOG_INFO, «socket created»);
return epoll_wait(elDesq, events, 10000, -1);
}

inline int epollListener::onConnect() {
socklen_t addrlen = sizeof (struct sockaddr_in);
bzero((char *) &client_addr, sizeof (client_addr));
syslog(LOG_INFO, «start wait for accept()»);
int cl;
cl= accept(sock, (struct sockaddr *) &client_addr, &addrlen);
if (ev.data.fd == -1) {
syslog(LOG_INFO, «accept(): %s», strerror(errno));
return -1;
}

setNonBlocking(ev.data.fd);
ev.data.fd=cl;
ev.events = EPOLLIN | EPOLLET;

if (epoll_ctl(elDesq, EPOLL_CTL_ADD, ev.data.fd, &ev) == -1) {
close(ev.data.fd);
return -1;
syslog(LOG_INFO, «epoll_ctl(): %s», strerror(errno));
}
return ev.data.fd;
}

inline void epollListener::setNonBlocking(int sock) {
int ret = -1;
int opts = fcntl(sock, F_GETFL);

if (opts >= 0) {
opts = (opts | O_NONBLOCK);
if (fcntl(sock, F_SETFL, opts) >= 0) {
ret = 0;
}
}

// return ret;
}

inline bool epollListener::isNew(int i) {
if (events[i].data.fd == sock)
return true;
else
return false;
}

inline void epollListener::Close() {
// shutdown(clients[slot], SHUT_RDWR);
close(elDesq);

close(sock);

}

inline bool epollListener::isSendError(int i) {

if (events[i].events & (EPOLLHUP | EPOLLERR)) {
return true;
} else {
return false;
}
}
inline int epollListener::getSockFromEvents(int i) {
return events[i].data.fd;
}
inline bool epollListener::isSendData(int i) {
if (events[i].events & EPOLLIN) {
return true;
} else {
return false;
}
}
inline void epollListener::closeSocket(int i){

if (epoll_ctl(elDesq,EPOLL_CTL_DEL, events[i].data.fd, &ev) == -1) {
syslog(LOG_INFO, «epoll_ctlDEL(): %s», strerror(errno));
}
close(events[i].data.fd);
}

Dronnikkl
() автор топика
Ответ на: код от Dronnikkl

Сам читай эту портянку. Нормальные люди выкладывают на пастебин

anonymous
()
Ответ на: код от Dronnikkl

Я даже помогу вам оформить код : http://paste.org.ru/?3sfuo4
К сожалению сказать в чем проблема не могу, не работал с сетью пока-что.

blinkenlichten
()
Ответ на: комментарий от ratatosk

Извините, 6 утра было уже) http://paste.org.ru/?3sfuo4 blinkenlichten спасибо Сейчас изменил номер порта у севера и клиентов на 5000 и все заработал пакеты доходят, но все равно в чем может быть причина? Уже не первый раз приходилось менять номера порта

Dronnikkl
() автор топика
Ответ на: комментарий от Dronnikkl

УМВР.

Если попробовать вернуть на 5001 опять не работает?

«пакеты не доходят» - значит, что даже соединение не устанавливается, верно? Клиенты в локалке или совсем удаленные? Если удаленные, то nmap сервера что говорит?

harvos
()
Ответ на: комментарий от harvos

Теперь снова работает на 5001, все совсем удаленные (это устройства которые скидывают координаты по GPRS) , Да соединения тоже не устанавливалось.

nmap с запущенным процессом на 5001 порту который уже ловит пакеты
#nmap -sV xxx.xxx.xxx.xxx -p 5001

PORT STATE SERVICE VERSION
5001/tcp open kerberos-sec Microsoft Windows kerberos-sec
Service Info: OS: Windows

Nmap finished: 1 IP address (1 host up) scanned in 64.931 seconds

Dronnikkl
() автор топика
Ответ на: комментарий от Dronnikkl

Пока не удастся добиться воспроизводимости, сложно будет что-то сказать

harvos
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.