Hi guys
I'm trying to connect to CISCO router using termios. So I decided to have two threads one for reading data and the other one for writing data.
And here's my code :
[code]int mainfd=0;
char ch[2] = {NULL};
void *write(void *)
{
char temp;
while(1)
{
temp = getchar();
ch[0] = temp; ch[1] = '';
if(temp == '~')
{
printf("connection closed.
");
close(mainfd);
pthread_exit(NULL);
}
check=write(mainfd, ch, 1);
ch[0]='';
}
}
void *read(void *)
{
char outputbuffer[10000]= {0};
while(1)
{
outputbuffer[0]='';
int charnumber=read(mainfd, &outputbuffer, sizeof(outputbuffer));
outputbuffer[charnumber] = '';
printf("%s",outputbuffer);
outputbuffer[0] = '';
}
}
int main(int argc,char *argv[])
{
//////////////////
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
//////////////////
struct termios options;
static int portnum=atoi(argv[1]);
mainfd = open_port(portnum);
fcntl(mainfd, F_SETFL, FNDELAY);
tcgetattr(mainfd, &options);
cfsetspeed(&options, speed);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag |= CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_iflag &= ~(ISTRIP|ICRNL);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ICANON|ISIG|IEXTEN|ECHO);
options.c_cc[VMIN] = 1;
options.c_cc[VTIME] = 0;
//
tcsetattr(mainfd, TCSAFLUSH, &options);
pthread_t threads[2];
pthread_create(&threads[0], NULL, write, NULL);
pthread_create(&threads[1], NULL, read, NULL);
pthread_exit(NULL);
}[/code]
The problem is that I have to add sleep(2) (at least 2s) after writing user input to the port (line 17 I think) otherwise the output would not be what I expect. Without this sleep command, every character I type, the output is shown with next character not at time :
[code]Router>
Router>abc // While I typed "abcd". If I continue with typing "e", then the output will be "abcd" and so on ...[/code]
How can I fix this ?