Hello all,
I am trying to run a listener on 5000 port , here my issue is once i get a connection it gets data through recv, and i send back a message based on a condition.
But in next iterieation it does not get stop here in recv call.
It contiously loop around for recv. my understanding is as the other side client is not sending any data to port 5000 , it should stop .
Here i donot think iam opening a socket in non blocking mode.
Can any body guide me where am i getting missed here.
Code:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/wait.h>
#include <syslog.h>
#define MYPORT 5000
#define BACKLOG 10
#define MAX_MSG 1000;
int new_fd;
int mysighandler(int signo)
{
close(new_fd);
syslog(LOG_DEBUG,"EXIT client program");
exit(0);
}
int main(void)
{
int sockfd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
socklen_t sin_size;
struct sigaction sa;
int yes = 1;
char mesg[1000];
char mesg1[570];
static int i = 0;
memset(mesg,0,1000);
memset(mesg1,0,570);
// strcpy(mesg1,"HTTP/1.1 200 OK\r\nCONTENT-LENGTH:435\r\nCONTENT-TYPE: text/xml; charset='UTF-8'\r\nSERVER: 'OS/version' UPnP/1.0 'product/version'\r\n\r\n<?xml version='1.0' encoding='UTF-8'?>\r\n<soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'\r\n soap-env:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>\r\n<soap-env:Body>\r\n<m:AuthenticateResponse\r\nxmlns:m='urn:NETGEAT-ROUTER:service:ParentalControl:1'>\r\n</m:AuthenticateResponse>\r\n<ResponseCode>000</ResponseCode>\r\n</soap-env:Body>\r\n</soap-env:Envelope>\r\n\0");
//strcpy(mesg1,"HTTP/1.1 200 OK\r\nCONTENT-LENGTH:435\r\nCONTENT-TYPE: text/xml; charset='UTF-8'SERVER: 'OS/version' UPnP/1.0 'product/version'\r\n\r\n<?xml version='1.0' encoding='UTF-8'?><soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/' soap-env:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'><soap-env:Body><m:AuthenticateResponse xmlns:m='urn:NETGEAT-ROUTER:service:ParentalControl:1'></m:AuthenticateResponse><ResponseCode>000</ResponseCode></soap-env:Body></soap-env:Envelope>\r\n\r\n");
//strcpy(mesg1,"HTTP/1.1 200 OK\r\nCONTENT-LENGTH:435\r\nCONTENT-TYPE: text/xml; charset='UTF-8'\r\nSERVER: 'OS/version' UPnP/1.0 'product/version'\r\n\r\n<?xml version='1.0' encoding='UTF-8'?>\r\n<soap-env:Envelope\r\nxmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'\r\nsoap-env:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>\r\n<soap-env:Body>\r\n<m:AuthenticateResponse\r\nxmlns:m='urn:NETGEAT-ROUTER:service:ParentalControl:1'>\r\n</m:AuthenticateResponse>\r\n<ResponseCode>000</ResponseCode>\r\n</soap-env:Body>\r\n</soap-env:Envelope>\r\n");
strcpy(mesg1,"HTTP/1.1 200 OK\r\nCONTENT-LENGTH:389\r\nCONTENT-TYPE: text/xml; charset=\"UTF-8\"\r\nSERVER: \"OS/version\" UPnP/1.0 \"product/version\"\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<soap-env:Envelope\r\nxmlns:soap-env=\"http://schemas.xmlsoap.org/soap/envelope/\"\r\nsoap-env:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n<soap-env:Body>\r\n<m:AuthenticateResponse\r\nxmlns:m=\"urn:NETGEAT-ROUTER:service:ParentalControl:1\">\r\n</m:AuthenticateResponse>\r\n<ResponseCode>000</ResponseCode>\r\n</soap-env:Body>\r\n</soap-env:Envelope>\r\n");
syslog(LOG_DEBUG,"Entered into the server program %d",__LINE__);
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("192.168.1.1");
memset(my_addr.sin_zero,'\0',sizeof(my_addr.sin_zero));
if (bind(sockfd,(struct sockaddr*) &my_addr,sizeof(struct sockaddr))== -1)
{
perror("bind");
exit(1);
}
syslog(LOG_DEBUG,"Entered into the server program %d",__LINE__);
if (listen(sockfd,BACKLOG) == -1)
{
perror("listen");
exit(1);
}
signal(SIGUSR1,mysighandler);
while(1)
{
syslog(LOG_DEBUG,"Entered into the server program %d",__LINE__);
sin_size = sizeof(struct sockaddr_in);
if((new_fd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)) == -1)
{
perror("accept");
continue;
}
while(1)
{
recv(new_fd,mesg,1000,0);
if(strstr(mesg,"Authenticate") != NULL)
{
i = 1;
send(new_fd,mesg1,570,0);
printf("sendign: %s",mesg1);
}
memset(mesg,0,1000);
}
}
close(new_fd);
return 0;
}