1. ./rtt-sender -d 127.0.0.1
2. ./rtt-responder -l 127.0.0.1
rtt-sender goes in Segmentation Fault and rtt-responder remains up. What i do wrong?
I see in debug messages that sendto_rt in transmitter function doesnt't send anything! Why?
the messages are:
sendo failed - perror: Success.
The segmentation fault happens after the first pthread_join, in __nptl_death_event() from /lib/tls/libthread.so.0
--
Teresa Noviello
Chiedersi Sempre:"Avro' il tempo di rifarlo?"
/*** * * examples/xenomai/posix/rtt-responder.c * * Round-Trip Time Responder - listens and sends back a packet * * Based on Ulrich Marx's module, later ported over user space POSIX. * * Copyright (C) 2002 Ulrich Marx <[EMAIL PROTECTED]> * 2002 Marc Kleine-Budde <[EMAIL PROTECTED]> * 2004, 2006 Jan Kiszka <[EMAIL PROTECTED]> * * RTnet - real-time networking example * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/mman.h>
#include <arpa/inet.h>
#include <rtnet.h>
//my defines
#define DEBUG 1
extern void switch_errno(int);
char *dest_ip_s = "";
char *local_ip_s = "";
unsigned int reply_size = 0;
pthread_t rt_thread;
#define RCV_PORT 36000
#define XMT_PORT 35999
struct sockaddr_in dest_addr;
int sock;
char buffer[65536];
void *responder(void* arg)
{
RT_TASK *task;
struct msghdr rx_msg;
struct iovec iov;
ssize_t ret;
if (dest_addr.sin_addr.s_addr == INADDR_ANY) {
rx_msg.msg_name = &dest_addr;
rx_msg.msg_namelen = sizeof(dest_addr);
} else {
rx_msg.msg_name = NULL;
rx_msg.msg_namelen = 0;
}
rx_msg.msg_namelen = sizeof(struct sockaddr_in);
rx_msg.msg_iov = &iov;
rx_msg.msg_iovlen = 1;
rx_msg.msg_control = NULL;
rx_msg.msg_controllen = 0;
//create rt_task
if (!(task = rt_task_init_schmod(nam2num("Responder"), 0, 0, 0, SCHED_FIFO, 0xF))) {
printf("CANNOT INIT Responder TASK\n");
exit(1);
}
mlockall(MCL_CURRENT|MCL_FUTURE);
rt_make_hard_real_time();
while(1) {
iov.iov_base = &buffer;
iov.iov_len = sizeof(buffer);
ret = recvmsg_rt(sock, &rx_msg, 0);
if (ret <= 0) {
printf("terminating responder thread\n");
return NULL;
}
sendto_rt(sock, &buffer, reply_size ? : ret, 0,
(struct sockaddr *)&dest_addr,
sizeof(struct sockaddr_in));
}
}
void catch_signal(int sig)
{
}
int main(int argc, char *argv[])
{
RT_TASK *task;
struct sockaddr_in local_addr;
int add_rtskbs = 30;
pthread_attr_t thattr;
int ret;
while (1) {
switch (getopt(argc, argv, "d:l:s:")) {
case 'd':
dest_ip_s = optarg;
break;
case 'l':
local_ip_s = optarg;
break;
case 's':
reply_size = atoi(optarg);
break;
case -1:
goto end_of_opt;
default:
printf("usage: %s [-d <dest_ip>] [-l <local_ip>] "
"[-s <reply_size>]\n", argv[0]);
return 0;
}
}
end_of_opt:
if (dest_ip_s[0])
inet_aton(dest_ip_s, &dest_addr.sin_addr);
else
dest_addr.sin_addr.s_addr = INADDR_ANY;
if (local_ip_s[0])
inet_aton(local_ip_s, &local_addr.sin_addr);
else
local_addr.sin_addr.s_addr = INADDR_ANY;
if (reply_size > 65505)
reply_size = 65505;
else if (reply_size < sizeof(struct timespec))
reply_size = sizeof(struct timespec);
signal(SIGTERM, catch_signal);
signal(SIGINT, catch_signal);
signal(SIGHUP, catch_signal);
printf("destination ip address: %s = %08x\n",
dest_ip_s[0] ? dest_ip_s : "SENDER", dest_addr.sin_addr.s_addr);
printf("local ip address: %s = %08x\n",
local_ip_s[0] ? local_ip_s : "INADDR_ANY", local_addr.sin_addr.s_addr);
printf("reply size: %d\n", reply_size);
//create rt_task
if (!(task = rt_task_init_schmod(nam2num("MainResp"), 0, 0, 0, SCHED_FIFO, 0xF))) {
printf("CANNOT INIT MainResp TASK\n");
exit(1);
}
mlockall(MCL_CURRENT|MCL_FUTURE);
/* create rt-socket */
if ((sock = socket_rt(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
switch_errno(errno);
perror("\n\t***\t\nsocket cannot be (_rt) created");
return 1;
}
/* bind the rt-socket to local_addr */
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(RCV_PORT);
if ((ret = bind_rt(sock, (struct sockaddr *)&local_addr,
sizeof(struct sockaddr_in))) < 0) {
close_rt(sock);
perror("cannot bind_rt to local ip/port");
return 1;
}
/* extend the socket pool */
ret = ioctl_rt(sock, RTNET_RTIOC_EXTPOOL, &add_rtskbs);
if (ret != add_rtskbs)
printf("WARNING: ioctl_rt(RTNET_RTIOC_EXTPOOL) = %d\n", ret);
/* create reply rt-thread */
pthread_attr_init(&thattr);
pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE);
pthread_attr_setstacksize(&thattr, PTHREAD_STACK_MIN);
ret = pthread_create(&rt_thread, &thattr, &responder, NULL);
if (ret) {
close(sock);
perror("pthread_create failed");
return 1;
}
pause();
/* Important: First close the socket! */
while ((close_rt(sock) < 0) && (errno == EAGAIN)) {
printf("socket busy - waiting...\n");
sleep(1);
}
pthread_kill(rt_thread, SIGHUP);
pthread_join(rt_thread, NULL);
return 0;
}
/***
*
* examples/xenomai/posix/rtt-requester.c
*
* Round-Trip Time Requester - sends packet, receives echo, evaluates
* and displays per-station round-trip times
*
* Based on Ulrich Marx's module, adopted to RTmac and later ported over
* user space POSIX.
*
* Copyright (C) 2002 Ulrich Marx <[EMAIL PROTECTED]>
* 2002 Marc Kleine-Budde <[EMAIL PROTECTED]>
* 2006 Jan Kiszka <[EMAIL PROTECTED]>
*
* RTnet - real-time networking example
* RTmac - real-time media access control example
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//my defines
#define DEBUG 1
#define __NOSEND__ 0
//#if DEBUG
#include <rtai_mq.h>
//#else
//#include <mqueue.h>
//#endif
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <netinet/in.h>
#include <sys/mman.h>
#include <arpa/inet.h>
#include <rtai_lxrt.h>
#include <rtnet.h>
#include <time.h>
char *dest_ip_s = "127.0.0.1";
char *local_ip_s = "";
unsigned int cycle = 100000; /* 100 ms */
pthread_t xmit_thread;
pthread_t recv_thread;
#define RCV_PORT 35999
#define XMT_PORT 36000
struct sockaddr_in dest_addr;
int sock;
mqd_t mq;
#define BUFSIZE 1500
union {
char data[BUFSIZE];
struct timespec tx_date;
} packet;
struct station_stats {
struct in_addr addr;
long long last, min, max;
unsigned long count;
};
struct packet_stats {
struct in_addr addr;
long long rtt;
};
#define MAX_STATIONS 100
static struct station_stats station[MAX_STATIONS];
extern void switch_errno(int);
static struct station_stats *lookup_stats(struct in_addr addr)
{
int i;
for (i = 0; i < MAX_STATIONS; i++) {
if (station[i].addr.s_addr == addr.s_addr)
break;
if (station[i].addr.s_addr == 0) {
station[i].addr = addr;
station[i].min = LONG_MAX;
station[i].max = LONG_MIN;
break;
}
}
if (i == MAX_STATIONS)
return NULL;
return &station[i];
}
void *transmitter(void *arg)
{
RT_TASK *task;
struct timespec next_period;
struct timespec tx_date;
//sostituiscimi
clock_gettime(CLOCK_MONOTONIC, &next_period);
//create rt_task
if (!(task = rt_task_init_schmod(nam2num("Transmitter"), 0, 0, 0, SCHED_FIFO, 0xF))) {
printf("CANNOT INIT Transmitter TASK\n");
exit(1);
}
mlockall(MCL_CURRENT|MCL_FUTURE);
rt_make_hard_real_time();
while(1) {
next_period.tv_nsec += cycle * 1000;
if (next_period.tv_nsec >= 1000000000) {
next_period.tv_nsec = 0;
next_period.tv_sec++;
}
//sostituiscimi
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next_period, NULL);
//sostituiscimi
clock_gettime(CLOCK_MONOTONIC, &tx_date);
/* transmit the request packet containing the local time */
if (sendto_rt(sock, &tx_date, sizeof(tx_date), 0,
(struct sockaddr *)&dest_addr,
sizeof(struct sockaddr_in)) < 0) {
printf("sendto_rt non riuscita, chiamo switch_errno\n");
switch_errno(errno);
if (errno == EBADF){
printf("terminating transmitter thread\n");
}
else
perror("sendto failed - perror");
//rt_make_soft_real_time();
//rt_task_delete(task);
return NULL;
}
} //fine while
rt_make_soft_real_time();
rt_task_delete(task);
}
void *receiver(void *arg)
{
RT_TASK *task;
struct msghdr msg;
struct iovec iov;
struct sockaddr_in addr;
struct timespec rx_date;
struct packet_stats stats;
int ret;
msg.msg_name = &addr;
msg.msg_namelen = sizeof(addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = NULL;
msg.msg_controllen = 0;
//create rt_task
if (!(task = rt_task_init_schmod(nam2num("Receiver"), 0, 0, 0, SCHED_FIFO, 0xF))) {
printf("CANNOT INIT Receiver TASK\n");
exit(1);
}
mlockall(MCL_CURRENT|MCL_FUTURE);
rt_make_hard_real_time();
while (1) {
iov.iov_base = &packet;
iov.iov_len = sizeof(packet);
ret = recvmsg_rt(sock, &msg, 0);
if (ret <= 0) {
printf("pacchetti non rt-ricevuti nel threads receiver!Invoco switch_errno\n");
switch_errno(errno);
printf("terminating receiver thread\n");
perror("error from perror\n");
rt_make_soft_real_time();
rt_task_delete(task);
return NULL;
}
clock_gettime(CLOCK_MONOTONIC, &rx_date);
stats.rtt = rx_date.tv_sec * 1000000000LL + rx_date.tv_nsec;
stats.rtt -= packet.tx_date.tv_sec * 1000000000LL +
packet.tx_date.tv_nsec;
stats.addr = addr.sin_addr;
mq_send(mq, (char *)&stats, sizeof(stats), 0);
}
rt_make_soft_real_time();
rt_task_delete(task);
}
void catch_signal(int sig)
{
mq_close(mq);
}
int main(int argc, char *argv[])
{
RT_TASK *task;
struct sched_param param = { .sched_priority = 1 };
struct sockaddr_in local_addr;
int add_rtskbs = 30;
pthread_attr_t thattr;
char mqname[16];
struct mq_attr mqattr;
int max_stations = 0;
int ret;
while (1) {
switch (getopt(argc, argv, "d:l:c::h")) {
case 'd':
dest_ip_s = optarg;
break;
case 'l':
local_ip_s = optarg;
break;
case 'c':
cycle = atoi(optarg);
break;
case -1:
goto end_of_opt;
case 'h':
printf("usage: %s [-d <dest_ip>] [-l <local_ip>] "
"[-c <cycle_microsecs>]\n", argv[0]);
return 0;
default:
printf("usage: %s [-d <dest_ip>] [-l <local_ip>] "
"[-c <cycle_microsecs>]\n", argv[0]);
return 0;
}
}
end_of_opt:
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(XMT_PORT);
if (dest_ip_s[0])
inet_aton(dest_ip_s, &dest_addr.sin_addr);
else
dest_addr.sin_addr.s_addr = INADDR_ANY;
if (local_ip_s[0])
inet_aton(local_ip_s, &local_addr.sin_addr);
else
local_addr.sin_addr.s_addr = INADDR_ANY;
signal(SIGTERM, catch_signal);
signal(SIGINT, catch_signal);
signal(SIGHUP, catch_signal);
printf("destination ip address: %s = %08x\n",
dest_ip_s[0] ? dest_ip_s : "SENDER", dest_addr.sin_addr.s_addr);
printf("local ip address: %s = %08x\n",
local_ip_s[0] ? local_ip_s : "INADDR_ANY", local_addr.sin_addr.s_addr);
printf("cycle: %d us\n", cycle);
//create rt_task
if (!(task = rt_task_init_schmod(nam2num("Prova"), 0, 0, 0, SCHED_FIFO, 0xF))) {
printf("CANNOT INIT PROVA TASK\n");
exit(1);
}
/* create rt-socket */
if ((sock = socket_rt(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
switch_errno(errno);
perror("\n\t***\t\nsocket cannot be (_rt) created:\n");
return 1;
}
/* bind the rt-socket to local_addr */
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(RCV_PORT);
if ((ret = bind_rt(sock, (struct sockaddr *)&local_addr,
sizeof(struct sockaddr_in))) < 0) {
close_rt(sock);
perror("cannot bind_rt to local ip/port");
return 1;
}
/* extend the socket pool */
//debug
#if DEBUG
printf("stampo RTNET_RTIOC_EXTPOOL:\t%d\n",RTNET_RTIOC_EXTPOOL);
#endif
ret = ioctl_rt(sock, RTNET_RTIOC_EXTPOOL, &add_rtskbs);
if (ret != add_rtskbs)
printf("WARNING: ioctl_rt(RTNET_RTIOC_EXTPOOL) = %d\n", ret);
if(ret < 0){
switch_errno(errno);
perror("L'errore nella ioctl_rt e'...\n");
}
/* create statistic message queue */
snprintf(mqname, sizeof(mqname), "rtt-sender-%d", getpid());
//debug
#if DEBUG
printf("Terminata la inizializzazione di nome di coda di messaggi:\n"
"scrivo il nome della coda di messaggi:`t%s\n",mqname);
#endif
mqattr.mq_flags = 0;
mqattr.mq_maxmsg = 100;
mqattr.mq_msgsize = sizeof(struct packet_stats);
mqattr.mq_curmsgs = 0;
//debug
#if DEBUG
printf("Terminata inizializzazione attributi della coda di messaggi\n");
#endif
mq = mq_open(mqname, O_RDWR | O_CREAT | O_EXCL, 0600, &mqattr);
//debug
#if DEBUG
printf("Terminata la mq_open\n");
#endif
if (mq == (mqd_t)-1) {
perror("opening mqueue failed");
close_rt(sock);
return 1;
}
//creazione dei threads, modalita' normale - non hard real time
/* create transmitter rt-thread */
pthread_attr_init(&thattr);
pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE);
pthread_attr_setstacksize(&thattr, PTHREAD_STACK_MIN);
//debug
#if DEBUG
printf("Creazione del transmitter pthread\n");
#endif
ret = pthread_create(&xmit_thread, &thattr, &transmitter, NULL);
if (ret) {
close_rt(sock);
mq_close(mq);
perror("pthread_create(transmitter) failed");
return 1;
}
//debug
#if DEBUG
printf("Creazione del receiver pthread\n");
#endif
ret = pthread_create(&recv_thread, &thattr, &receiver, NULL);
if (ret) {
close_rt(sock);
mq_close(mq);
perror("pthread_create(receiver) failed");
return 1;
}
//debug
#if DEBUG
printf("Terminata creazione dei pthreads\n");
#endif
mlockall(MCL_CURRENT|MCL_FUTURE);
//se la chiamata a rt_make_hard_real_time
//viene fatta prima della ioctl non va bene!!
rt_make_hard_real_time();
//debug
#if DEBUG
printf("Invocata rt_make_hard_real_time();\n");
#endif
while (1) {
struct packet_stats pack;
struct station_stats *pstat;
int nr;
ret = mq_receive(mq, (char *)&pack, sizeof(pack), NULL);
if (ret < (int)sizeof(pack))
break;
pstat = lookup_stats(pack.addr);
if (!pstat)
continue;
pstat->last = pack.rtt;
if (pstat->last < pstat->min)
pstat->min = pstat->last;
if (pstat->last > pstat->max)
pstat->max = pstat->last;
pstat->count++;
nr = pstat - &station[0];
if (nr > max_stations)
max_stations = nr;
printf("%s\t%.3f us, min=%.3f us, max=%.3f us, count=%ld\r"
"\033[%dA\n", inet_ntoa(pack.addr), (float)pstat->last/1000,
(float)pstat->min/1000, (float)pstat->max/1000,
pstat->count, nr);
}
/* This call also performs the required switch to secondary mode for
socket cleanup. */
printf("\033[%dB\n", max_stations);
/* Important: First close the socket! */
while ((close_rt(sock) < 0) && (errno == EAGAIN)) {
printf("socket busy - waiting...\n");
sleep(1);
}
rt_make_soft_real_time();
rt_task_delete(task);
//le join vanno fatte alla fine, dopo rt_make_soft_real_time
pthread_join(xmit_thread, NULL);
pthread_kill(recv_thread, SIGHUP);
pthread_join(recv_thread, NULL);
return 0;
}
------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________ RTnet-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/rtnet-users

