[LCP]sockets problem
Andrew Weaver
Andrew.Weaver at tecnomen.fi
Tue Jan 29 23:44:16 UTC 2002
1. ALWAYS check return codes from system calls.
2. The select() returns an indication of the descriptors that have been hit
back into the fd_set arrays that you gave it. So the descriptor that is hit
first will remain in the mask and will thereafter be the only one tested
for. You must refresh the set before each iteration of the select. See the
man entry.
So, put the
FD_SET(0,&clientset);
FD_SET(scklisten,&clientset);
inside the while loop and you will get what you need. This applies to both
apps. Your client appears to work because you hit the keyboard first and
then only test for keyboard. On the server side, you got a hit on the server
socket so only tested for that one thereafter.
> -----Original Message-----
> From: Srinath © [SMTP:redindian at nettaxi.com]
> Sent: Sunday, January 27, 2002 2:27 PM
> To: linuxcprogramming at lists.linux.org.au
> Subject: [LCP]sockets problem
>
> Hi all,
>
> I am just learning sockets. I wrote two programs - serv.c and clie.c .
> my aim is to run them separately in two virtual terminals and if i type
> something in one of them and press enter, it should go to the other one.
> I've copied both of them into this email. now , my problem is that if i
> type in client, it is reaching the server, but when i type in the server,
> it
> is not reaching the client. In fact, that particular block never gets
> control.
> Please tell me where i am making mistake !!
>
> Thanks,
> Srinath
>
>
> *******************clie.c*******************
> #include<stdio.h>
> #include<sys/socket.h>
> #include<sys/types.h>
> #include<netinet/in.h>
> #include<netdb.h>
> #include<unistd.h>
> #include<string.h>
>
> #define SERVERPORT 3999
> #define CLIENTPORT 4999
>
> int main()
> {
> int sockno, scklisten, sockno1;
> struct sockaddr_in serv, sacli;
> char buffer[35];
> struct servent *svt;
> struct hostent *ht;
> int len, size;
> fd_set clientset;
>
> FD_ZERO(&clientset);
>
> ht=gethostbyname("SRI");
>
> serv.sin_addr.s_addr=INADDR_ANY;
> serv.sin_family=AF_INET;
> serv.sin_port=htons(SERVERPORT);
> memset(&(serv.sin_zero),'\0',8);
> bcopy((char *)ht->h_addr,(char *)&serv.sin_addr,ht->h_length);
>
> sacli.sin_family=AF_INET;
> sacli.sin_port=htons(CLIENTPORT);
> sacli.sin_addr.s_addr=INADDR_ANY;
>
> sockno=socket(AF_INET,SOCK_STREAM,0);
> connect(sockno,(struct sockaddr *)&serv, sizeof(struct sockaddr));
>
> strcpy(buffer,"Client has initiated connection\n");
> write(sockno,buffer,strlen(buffer));
> close (sockno);
>
> memset(buffer,'\0',34);
> scklisten=socket(AF_INET,SOCK_STREAM,0);
> bind(scklisten, (struct sockaddr *)&sacli,sizeof(struct sockaddr));
> listen(scklisten,15);
>
> FD_SET(0,&clientset);
> FD_SET(scklisten,&clientset);
>
> while(1)
> {
> select(scklisten+1,&clientset,NULL,NULL,0);
>
> if(FD_ISSET(scklisten,&clientset))
> {
> sockno=accept(scklisten, (struct sockaddr *)&serv, &size);
> read(sockno,buffer,34);
> printf("\n%s\n",buffer);
> close(sockno);
> }
> if(FD_ISSET(0,&clientset))
> {
> read(0,buffer,34);
> sockno=socket(AF_INET,SOCK_STREAM,0);
> connect(sockno,(struct sockaddr *)&serv, sizeof(struct sockaddr));
> write(sockno,buffer,strlen(buffer));
> close (sockno);
> }
> }
> }
>
> *******************serv.c*******************
> #include<stdio.h>
> #include<sys/types.h>
> #include<sys/socket.h>
> #include<netinet/in.h>
> #include<netdb.h>
> #include<pwd.h>
>
> #define SERVERPORT 3999
> #define CLIENTPORT 4999
>
> int main()
> {
> int sockfd, newsockfd, wsock;
> struct servent *st;
> struct hostent *ht;
> struct sockaddr_in serv, cli;
> char localhost[26];
> int size;
> char buffer[35] ;
> int bufsize;
> fd_set masterset;
>
> FD_ZERO(&masterset);
> ht=gethostbyname("SRI");
>
> serv.sin_family=AF_INET;
> serv.sin_port=htons(SERVERPORT);
> serv.sin_addr.s_addr=INADDR_ANY;
> memset(&(serv.sin_zero),'\0',8);
>
> if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
> {
> perror("socket initialisation error"); exit(0);
> }
>
> bind(sockfd,(struct sockaddr *)&serv,sizeof(struct sockaddr));
> listen(sockfd,5);
>
> FD_SET(0,&masterset);
> FD_SET(sockfd,&masterset);
>
> while(1)
> {
> select(sockfd+1,&masterset,NULL,NULL,0);
>
> if(FD_ISSET(0,&masterset))
> {
> /* CONTROL IS NEVER COMING HERE AS NOTHING IS PRINTED */
> printf("keyboard getting ctrl");
> wsock=socket(AF_INET,SOCK_STREAM,0);
>
> cli.sin_port=htons(CLIENTPORT);
> cli.sin_family=AF_INET;
> cli.sin_addr.s_addr=INADDR_ANY;
> bcopy((char *)ht->h_addr,(char *)&cli.sin_addr,ht->h_length);
> memset(&(cli.sin_zero),'\0',8);
>
> connect(wsock, (struct sockaddr *)&cli, sizeof(struct sockaddr));
> read(0,buffer,34);
> write(wsock,buffer,strlen(buffer));
> close(wsock);
> }
>
> if(FD_ISSET(sockfd,&masterset))
> {
> newsockfd=accept(sockfd, (struct sockaddr *)&cli, &size);
> read(newsockfd, buffer, 34);
> printf("\nClient: %s\n",buffer);
> memset(buffer,'\0',34);
> close(newsockfd);
> }
> }
> }
>
More information about the linuxCprogramming
mailing list