-
Socket program
Hi,
I'm writing a client-server socket program. the client will be an instance of the well-known telnet application. i want to implement a simple authentication between the server and the client.
- the client should send this message (after the connection established): my password "anypassword"
and the server will check, if it's not the same password that's hardcoded in the server program, the server close connection.
so the client will be like that:
1.telnet server
2. got connected
3. provide password, if it's not coreect server close connection
here is my server application:
Code:
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>
#define SERVERPORT 111 /* port used for the connection */
#define QUEUE 5 /* max # of queued connects */
int main(void)
{
fd_set master; // master file descriptor list
fd_set read_fds; // temp file descriptor list for select()
int fdmax; // maximum file descriptor number
int i , j;
int nbytes;
int s_listen,d_newconn;
int yes=1;
struct sockaddr_in serveraddr; /* server address */
struct sockaddr_in clientaddr; /* client address */
struct sigaction sig;
socklen_t sin_size; /* Socket address length type */
string buffer[256];
FD_ZERO(&master); // clear the master and temp sets
FD_ZERO(&read_fds);
if ((s_listen = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* create listen socket */
perror("socket");
exit(1);
}
/* set the options for the socket to allow reuse of a local port/address combination. */
if (setsockopt(s_listen,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
memset(&(serveraddr.sin_zero), '\0', 8); /* clear our address */
serveraddr.sin_family = AF_INET; /* Address Family */
serveraddr.sin_port = htons(SERVERPORT); /* Port number */
/* a wild IP number to allow the system to pick the route to the remote service */
serveraddr.sin_addr.s_addr = INADDR_ANY;
/* bind address to socket */
if (bind(s_listen, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr)) == -1) {
perror("bind");
exit(1);
}
/*listen*/
if (listen(s_listen, QUEUE) == -1) {
perror("listen");
exit(1);
}
// add the listener to the master set
FD_SET(s_listen, &master);
// keep track of the biggest file descriptor
fdmax = s_listen; // so far, it's this one
// main loop
for(;;) {
read_fds = master; // copy it
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(1);
}
// run through the existing connections looking for data to read
for(i = 0; i <= fdmax; i++) {
if (FD_ISSET(i, &read_fds)) { // we got one!!
if (i == s_listen) {
// handle new connections
sin_size = sizeof(clientaddr);
if ((d_newconn = accept(s_listen, (struct sockaddr *)&clientaddr,
&sin_size)) == -1) {
perror("accept");
} else {
FD_SET(d_newconn, &master); // add to master set
if (d_newconn > fdmax) { // keep track of the maximum
fdmax = d_newconn;
}
printf("EDMTS SERVER: new connection from %s on "
"socket %d\n", inet_ntoa(clientaddr.sin_addr), d_newconn);
}
} else {
// handle data from a client
if ((nbytes = recv(i, buffer, sizeof(buffer), 0)) <= 0) {
// got error or connection closed by client
if (nbytes == 0) {
// connection closed
printf("SERVER: socket %d hung up\n", i);
} else {
perror("recv");
}
close(i); // bye!
FD_CLR(i, &master); // remove from master set
} else {
/*
{{{{{{{{{{{{{{{{{{{{{{ NOT COMPLETED }}}}}}}}}}}}}}}}}
{{{{HERE I SHOULD COMPARE THE CLIENT MESSAGE PASSOWRD IF IT'S THE SAME }}}}}}}}}} */
}
} // it's SO UGLY!
}
}
}
return 0;
}
-
-
yeah.. right.. what is the question now.. ??
or
Are you expecting us to wright the client pgm.. ?? :-)
-
Your thread bumps and cross-posts have been deleted - check the rules.
-
hi
sorry may be may question is not clear
i want to add in that server program that it will accept only the password from the client if it's "mypassword":
i'm not writing any client program. the client will be the built in linux Telnet program
so the session will be between the server and client as follows
1. Client will type : telnet 192.11.11.9
the password mypassword.
2.then the server if recieved the password "mypassword" it will connect if not it will close the connection.
I want to know how i can make the server program recognize that the pasword is right or wrong..how i can write it in the server
Thanks....sorry for misunderstanding
-
So you would have us believe that you wrote this entire program, but you've never heard of strcmp?
Quzah.