Я обнаружил проблему с реализацией потоков, что мне странно.Может быть, некоторые из вас могут мне это объяснить, было бы здорово.
Я работаю над чем-то вроде прокси-сервера, программы (работающей на разных машинах), которая получает пакеты через eth0 и отправляет их через ath0 (беспроводной)на другую машину, которая делает то же самое.На самом деле я не совсем уверен, что является причиной моей проблемы, потому что я новичок во всем, в программировании на Linux и C.
Я запускаю два потока,
- один слушает (socket) на eth0 для входящих пакетов и отправляет их через ath0 (также socket)
- , а другой поток прослушивает ath0 и отправляет через eth0.
Если я использую потоки,Я получаю сообщение об ошибке, подобное этому:
sh-2.05b# ./socketex
Failed to send network header packet.
: Interrupted system call
Если я использую fork (), программа работает как положено.Может кто-нибудь объяснить мне такое поведение?
Просто чтобы показать, что реализация отправителя здесь приводит его фрагмент кода:
while(keep_going) {
memset(&buffer[0], '\0', sizeof(buffer));
recvlen = recvfrom(sockfd_in, buffer, BUFLEN, 0, (struct sockaddr *) &incoming, &ilen);
if(recvlen < 0) {
perror("something went wrong / incoming\n");
exit(-1);
}
strcpy(msg, buffer);
buflen = strlen(msg);
sentlen = ath_sendto(sfd, &btpinfo, &addrnwh, &nwh, buflen, msg, &selpv2, &depv);
if(sentlen == E_ERR) {
perror("Failed to send network header packet.\n");
exit(-1);
}
}
UPDATE : мой основной файл, запускающий либо потокиили процессы (разветвление)
int main(void) {
port_config pConfig;
memset(&pConfig, 0, sizeof(pConfig));
pConfig.inPort = 2002;
pConfig.outPort = 2003;
pid_t retval = fork();
if(retval == 0) {
// child process
pc2wsuThread((void *) &pConfig);
} else if (retval < 0) {
perror("fork not successful\n");
} else {
// parent process
wsu2pcThread((void *) &pConfig);
}
/*
wint8 rc1, rc2 = 0;
pthread_t pc2wsu;
pthread_t wsu2pc;
rc1 = pthread_create(&pc2wsu, NULL, pc2wsuThread, (void *) &pConfig);
rc2 = pthread_create(&wsu2pc, NULL, wsu2pcThread, (void *) &pConfig);
if(rc1) {
printf("error: pthread_create() is %d\n", rc1);
return(-1);
}
if(rc2) {
printf("error: pthread_create() is %d\n", rc2);
return(-1);
}
pthread_join(pc2wsu, NULL);
pthread_join(wsu2pc, NULL);
*/
return 0;
}
Помогает ли это?
update 05/30/2011
-sh-2.05b# ./wsuproxy 192.168.1.100
mgmtsrvc
mgmtsrvc
Failed to send network header packet.
: Interrupted system call
13.254158,75.165482,DATAAAAAAmgmtsrvc
mgmtsrvc
mgmtsrvc
Все еще получаю прерванную системупозвоните, как вы можете видеть выше.Я заблокировал все сигналы следующим образом:
sigset_t signal_mask;
sigfillset(&signal_mask);
sigprocmask(SIG_BLOCK, &signal_mask, NULL);
Два потока работают на одинаковых интерфейсах, но на разных портах.Кажется, проблема все еще остается в том же месте (пожалуйста, найдите ее в первом фрагменте кода).Я не могу идти дальше и не знаю, как решить эту проблему.Может быть, некоторые из вас могут помочь мне здесь снова.
Заранее спасибо.