Commit dec41427 authored by AXEL JAMES's avatar AXEL JAMES Committed by Bhavesh Yadav

UDP from client - server

parent b97566f8
...@@ -6,9 +6,57 @@ ...@@ -6,9 +6,57 @@
#include <netdb.h> #include <netdb.h>
#include <unistd.h> #include <unistd.h>
#include "parsexml.h" #include "parsexml.h"
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 8080 #define PORT 8080
void sendUDP(char * msg, char ip[], int port, bool recvResponse, char * buffer, int src_port)
{
int sockfd;
struct sockaddr_in servaddr,srcaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
// Filling server information
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr.s_addr = inet_addr(ip);
int n, len;
memset(&srcaddr, 0, sizeof(srcaddr));
srcaddr.sin_family = AF_INET;
srcaddr.sin_port = htons(src_port);
srcaddr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *) &srcaddr, sizeof(srcaddr)) < 0) {
perror("bind");
exit(1);
}
sendto(sockfd, (const char *)msg, strlen(msg),
MSG_CONFIRM, (const struct sockaddr *) &servaddr,
sizeof(servaddr));
if (recvResponse)
{
n = recvfrom(sockfd, (char *)buffer, 257*1024,
MSG_WAITALL, (struct sockaddr *) &servaddr,
&len);
buffer[n] = '\0';
}
close(sockfd);
}
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
int sock_fd, addrlen, msglen; int sock_fd, addrlen, msglen;
...@@ -18,37 +66,43 @@ int main(int argc, char** argv) ...@@ -18,37 +66,43 @@ int main(int argc, char** argv)
char *operation = (char *)malloc(sizeof(char)*7); char *operation = (char *)malloc(sizeof(char)*7);
if( (sock_fd = socket(AF_INET , SOCK_STREAM , 0)) == 0) { //Connection oriented Socket, choose protocol automatically (0) // if( (sock_fd = socket(AF_INET , SOCK_STREAM , 0)) == 0) { //Connection oriented Socket, choose protocol automatically (0)
printf("%s",toRespXML("Network Error: Could not create socket")); // printf("%s",toRespXML("Network Error: Could not create socket"));
exit(1); // exit(1);
} // }
clientAddr.sin_family = AF_INET; // clientAddr.sin_family = AF_INET;
clientAddr.sin_port = htons(PORT); // clientAddr.sin_port = htons(PORT);
clientAddr.sin_addr.s_addr = INADDR_ANY; //inet_addr("localhost");// inet_aton("localhost",&(clientAddr.sin_addr)); // clientAddr.sin_addr.s_addr = INADDR_ANY; //inet_addr("localhost");// inet_aton("localhost",&(clientAddr.sin_addr));
memset(&(clientAddr.sin_zero), '\0', 8); // memset(&(clientAddr.sin_zero), '\0', 8);
addrlen = sizeof(struct sockaddr_in); // addrlen = sizeof(struct sockaddr_in);
if( connect(sock_fd, (struct sockaddr *)&clientAddr, addrlen)<0) { // if( connect(sock_fd, (struct sockaddr *)&clientAddr, addrlen)<0) {
printf("%s",toRespXML("Network Error: Could not connect")); // printf("%s",toRespXML("Network Error: Could not connect"));
exit(1); // exit(1);
} // }
FILE *fp; FILE *fp;
if (argc >= 2){ int src_port = 30000;
fp = fopen(argv[1], "r"); // puts(argc);
if (argc >= 2){
src_port=atoi(argv[1]);
// write(1,src_port,5);
}
if (argc >= 3){
fp = fopen(argv[2], "r");
if (fp==NULL){ if (fp==NULL){
printf("ERROR:File doesn't exist\n"); printf("ERROR:File doesn't exist\n");
return -1; return -1;
} }
} }
FILE *outFp; FILE *outFp;
if(argc>=3) if(argc>=4)
outFp = fopen(argv[2],"w+"); outFp = fopen(argv[3],"w+");
while(1){ while(1){
// batch mode // batch mode
if(argc >= 2) { if(argc >= 3) {
if(fscanf(fp,"%[^,],",operation)==EOF) if(fscanf(fp,"%[^,],",operation)==EOF)
break; break;
if(!strcmp(operation,"put") || !strcmp(operation,"PUT")) if(!strcmp(operation,"put") || !strcmp(operation,"PUT"))
...@@ -68,12 +122,13 @@ int main(int argc, char** argv) ...@@ -68,12 +122,13 @@ int main(int argc, char** argv)
continue; continue;
} }
message = toXML(operation,key,value); message = toXML(operation,key,value,"127.0.0.1",src_port);
write(sock_fd, message, strlen(message)); // write(sock_fd, message, strlen(message));
msglen = read(sock_fd, buffer, 257*1024); // msglen = read(sock_fd, buffer, 257*1024);
buffer[msglen] = '\0'; // buffer[msglen] = '\0';
sendUDP(message, "localhost", PORT, true,buffer,src_port);
extractRespXml(outFp,buffer); extractRespXml(outFp,buffer);
if(argc>=4) if(argc>=5)
if(!strcmp(argv[3],"-p")) if(!strcmp(argv[3],"-p"))
puts(buffer); puts(buffer);
} }
...@@ -100,14 +155,16 @@ int main(int argc, char** argv) ...@@ -100,14 +155,16 @@ int main(int argc, char** argv)
continue; continue;
} }
message = toXML(operation,key,value); // message = toXML(operation,key,value);
write(sock_fd, message, strlen(message)); // write(sock_fd, message, strlen(message));
msglen = read(sock_fd, buffer, 257*1024); // msglen = read(sock_fd, buffer, 257*1024);
buffer[msglen] = '\0'; // buffer[msglen] = '\0';
message = toXML(operation,key,value,"127.0.0.1",src_port);
sendUDP(message, "127.0.0.1", PORT, true,buffer,src_port);
puts(buffer); puts(buffer);
} }
} }
fclose(outFp); fclose(outFp);
return 0; return 0;
} }
\ No newline at end of file
...@@ -21,7 +21,7 @@ char *toRespXML(char* msg){ ...@@ -21,7 +21,7 @@ char *toRespXML(char* msg){
} }
char * toXML(char *reqType, char *key, char * value){ char * toXML(char *reqType, char *key, char * value, char * ip, int port){
char *line1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; char *line1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
char *line21 = "<KVMessage type=\""; char *line21 = "<KVMessage type=\"";
...@@ -30,10 +30,14 @@ char * toXML(char *reqType, char *key, char * value){ ...@@ -30,10 +30,14 @@ char * toXML(char *reqType, char *key, char * value){
char *line32 = "</Key>\n"; char *line32 = "</Key>\n";
char *line41 = "<Value>"; char *line41 = "<Value>";
char *line42 = "</Value>\n"; char *line42 = "</Value>\n";
char *line61 = "<Address>";
char *line62 = "</Address>\n";
char *line5 = "</KVMessage>\n"; char *line5 = "</KVMessage>\n";
char *line6;
int len2 = strlen(line21)+strlen(line22)+strlen(reqType)+1; int len2 = strlen(line21)+strlen(line22)+strlen(reqType)+1;
int len3 = strlen(line31)+strlen(line32)+strlen(key)+1; int len3 = strlen(line31)+strlen(line32)+strlen(key)+1;
int len4 = strlen(line41)+strlen(line42)+strlen(value)+1; int len4 = strlen(line41)+strlen(line42)+strlen(value)+1;
int len6 = strlen(line61)+strlen(line62)+21;
char *line2 = (char *)malloc(sizeof(char) * len2); char *line2 = (char *)malloc(sizeof(char) * len2);
char *line3 = (char *)malloc(sizeof(char) * len3); char *line3 = (char *)malloc(sizeof(char) * len3);
...@@ -52,17 +56,38 @@ char * toXML(char *reqType, char *key, char * value){ ...@@ -52,17 +56,38 @@ char * toXML(char *reqType, char *key, char * value){
strcat(line4,line42); strcat(line4,line42);
int msglen = strlen(line1)+strlen(line2)+strlen(line3)+strlen(line4)+strlen(line5)+1; int msglen = strlen(line1)+strlen(line2)+strlen(line3)+strlen(line4)+strlen(line5)+1;
if (ip!=NULL)
{
char str[7];
sprintf(str, " %d", port);
line6 = (char *)malloc(sizeof(char) * len6);
strcpy(line6,line61);
strcat(line6,ip);
strcat(line6, str);
strcat(line6,line62);
msglen +=strlen(line6);
}
char *message = (char *)malloc(sizeof(char) * msglen); char *message = (char *)malloc(sizeof(char) * msglen);
strcpy(message,line1); strcpy(message,line1);
strcat(message,line2); strcat(message,line2);
strcat(message,line3); strcat(message,line3);
if(!strcmp(reqType,"putreq") || !strcmp(reqType,"resp")) if(!strcmp(reqType,"putreq") || !strcmp(reqType,"resp"))
strcat(message,line4); strcat(message,line4);
if (ip!=NULL)
{
strcat(message,line6);
free(line6);
}
strcat(message,line5); strcat(message,line5);
free(line2);free(line3);free(line4); free(line2);free(line3);free(line4);
printf("Message%s",message);
return message; return message;
} }
...@@ -111,7 +136,7 @@ extReq_t *extractXML(char *buffer){ ...@@ -111,7 +136,7 @@ extReq_t *extractXML(char *buffer){
char *p,*q; char *p,*q;
req->operation = malloc(sizeof(char)*12); req->operation = malloc(sizeof(char)*12);
req->err = malloc(sizeof(char)*170); req->err = malloc(sizeof(char)*170);
req->val = malloc(sizeof(char)*256*1024+1); req->val = malloc(sizeof(char)*256*1024+1);
req->error=true; req->error=true;
p = strstr(buffer, "type=")+ 6; p = strstr(buffer, "type=")+ 6;
q = strstr(buffer, "\">"); q = strstr(buffer, "\">");
...@@ -154,7 +179,27 @@ extReq_t *extractXML(char *buffer){ ...@@ -154,7 +179,27 @@ extReq_t *extractXML(char *buffer){
req->val[q-p] = '\0'; req->val[q-p] = '\0';
} }
} }
p = strstr(buffer, "<Address>")+9;
q = strstr(buffer, "</Address>");
if(p!=NULL && q!=NULL){
strcpy(req->ipAddr,strtok(p, " "));
int l = strlen(req->ipAddr);
printf("ip:%s",req->ipAddr);
char port_s[6];
memcpy(port_s,p+l+1,q-p-l-1);
port_s[q-p-l-1] = '\0';
req->port = atoi(port_s);
}
req->error = false; req->error = false;
return req; return req;
} }
\ No newline at end of file
// void main(){
// extReq_t *request = extractXML(toXML("abc","cdefg","123","111.111.111.111",12345));
// printf("Parsed msg:%s %d",request->ipAddr,request->port);
// }
\ No newline at end of file
...@@ -5,10 +5,12 @@ struct extractedReq { ...@@ -5,10 +5,12 @@ struct extractedReq {
char* val; char* val;
char* operation; char* operation;
char* err; char* err;
char ipAddr[16];
int port;
bool error; bool error;
}; };
typedef struct extractedReq extReq_t; typedef struct extractedReq extReq_t;
char *toXML(char *reqType, char *key, char * value); char *toXML(char *reqType, char *key, char * value, char * ip, int port);
extReq_t *extractXML(char *buffer); extReq_t *extractXML(char *buffer);
char *toRespXML(char* msg); char *toRespXML(char* msg);
char *extractRespXml(FILE *fp,char *buffer); char *extractRespXml(FILE *fp,char *buffer);
// Server side implementation of UDP client-server model
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "parsexml.h"
// #define PORT 8080
#define MAXLINE 1024
// Driver code
int main(int argc, char * argv[]) {
int sockfd;
char buffer[MAXLINE];
char *hello = "Message<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
<KVMessage type=\"abc\">\
<Key>cdefg</Key>\
<Address>111.111.111.111 12345</Address>\
</KVMessage>";
struct sockaddr_in servaddr, cliaddr, nextserv;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&nextserv,0,sizeof(nextserv));
memset(&cliaddr, 0, sizeof(cliaddr));
// Filling server information
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(atoi(argv[1]));
// Bind the socket with the server address
if ( bind(sockfd, (const struct sockaddr *)&servaddr,
sizeof(servaddr)) < 0 )
{
perror("bind failed");
exit(EXIT_FAILURE);
}
int len, n;
n = recvfrom(sockfd, (char *)buffer, MAXLINE,
MSG_WAITALL, ( struct sockaddr *) &cliaddr,
&len);
buffer[n] = '\0';
printf("Client : %s\n", buffer);
if (argc>=3)
{
cliaddr.sin_family = AF_INET; // IPv4
cliaddr.sin_addr.s_addr = INADDR_ANY;
cliaddr.sin_port = htons(atoi(argv[2]));
sendto(sockfd, (const char *)buffer, strlen(buffer),
MSG_CONFIRM, (const struct sockaddr *) &cliaddr,
len);
/* code */
}
else
{
extReq_t *req = extractXML(buffer);
cliaddr.sin_family = AF_INET; // IPv4
cliaddr.sin_addr.s_addr = inet_addr(req->ipAddr);
cliaddr.sin_port = htons(req->port);
puts(req->ipAddr);
printf("%d",req->port);extReq_t *extractXML(char *buffer);
sendto(sockfd, (const char *)hello, strlen(hello),
MSG_CONFIRM, (const struct sockaddr *) &cliaddr,
len);
}
printf("Hello message sent.\n");
return 0;
}
...@@ -81,6 +81,7 @@ char * toXML(char *reqType, char *key, char * value, char * ip, int port){ ...@@ -81,6 +81,7 @@ char * toXML(char *reqType, char *key, char * value, char * ip, int port){
if (ip!=NULL) if (ip!=NULL)
{ {
strcat(message,line6); strcat(message,line6);
free(line6);
} }
strcat(message,line5); strcat(message,line5);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment