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

UDP from client - server

parent b97566f8
......@@ -6,9 +6,57 @@
#include <netdb.h>
#include <unistd.h>
#include "parsexml.h"
#include <arpa/inet.h>
#include <netinet/in.h>
#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 sock_fd, addrlen, msglen;
......@@ -18,37 +66,43 @@ int main(int argc, char** argv)
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"));
exit(1);
}
// printf("%s",toRespXML("Network Error: Could not create socket"));
// exit(1);
// }
clientAddr.sin_family = AF_INET;
clientAddr.sin_port = htons(PORT);
clientAddr.sin_addr.s_addr = INADDR_ANY; //inet_addr("localhost");// inet_aton("localhost",&(clientAddr.sin_addr));
memset(&(clientAddr.sin_zero), '\0', 8);
addrlen = sizeof(struct sockaddr_in);
// clientAddr.sin_family = AF_INET;
// clientAddr.sin_port = htons(PORT);
// clientAddr.sin_addr.s_addr = INADDR_ANY; //inet_addr("localhost");// inet_aton("localhost",&(clientAddr.sin_addr));
// memset(&(clientAddr.sin_zero), '\0', 8);
// addrlen = sizeof(struct sockaddr_in);
if( connect(sock_fd, (struct sockaddr *)&clientAddr, addrlen)<0) {
printf("%s",toRespXML("Network Error: Could not connect"));
exit(1);
}
// if( connect(sock_fd, (struct sockaddr *)&clientAddr, addrlen)<0) {
// printf("%s",toRespXML("Network Error: Could not connect"));
// exit(1);
// }
FILE *fp;
int src_port = 30000;
// puts(argc);
if (argc >= 2){
fp = fopen(argv[1], "r");
src_port=atoi(argv[1]);
// write(1,src_port,5);
}
if (argc >= 3){
fp = fopen(argv[2], "r");
if (fp==NULL){
printf("ERROR:File doesn't exist\n");
return -1;
}
}
FILE *outFp;
if(argc>=3)
outFp = fopen(argv[2],"w+");
if(argc>=4)
outFp = fopen(argv[3],"w+");
while(1){
// batch mode
if(argc >= 2) {
if(argc >= 3) {
if(fscanf(fp,"%[^,],",operation)==EOF)
break;
if(!strcmp(operation,"put") || !strcmp(operation,"PUT"))
......@@ -68,12 +122,13 @@ int main(int argc, char** argv)
continue;
}
message = toXML(operation,key,value);
write(sock_fd, message, strlen(message));
msglen = read(sock_fd, buffer, 257*1024);
buffer[msglen] = '\0';
message = toXML(operation,key,value,"127.0.0.1",src_port);
// write(sock_fd, message, strlen(message));
// msglen = read(sock_fd, buffer, 257*1024);
// buffer[msglen] = '\0';
sendUDP(message, "localhost", PORT, true,buffer,src_port);
extractRespXml(outFp,buffer);
if(argc>=4)
if(argc>=5)
if(!strcmp(argv[3],"-p"))
puts(buffer);
}
......@@ -100,11 +155,13 @@ int main(int argc, char** argv)
continue;
}
message = toXML(operation,key,value);
write(sock_fd, message, strlen(message));
// message = toXML(operation,key,value);
// write(sock_fd, message, strlen(message));
msglen = read(sock_fd, buffer, 257*1024);
buffer[msglen] = '\0';
// msglen = read(sock_fd, buffer, 257*1024);
// 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);
}
}
......
......@@ -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 *line21 = "<KVMessage type=\"";
......@@ -30,10 +30,14 @@ char * toXML(char *reqType, char *key, char * value){
char *line32 = "</Key>\n";
char *line41 = "<Value>";
char *line42 = "</Value>\n";
char *line61 = "<Address>";
char *line62 = "</Address>\n";
char *line5 = "</KVMessage>\n";
char *line6;
int len2 = strlen(line21)+strlen(line22)+strlen(reqType)+1;
int len3 = strlen(line31)+strlen(line32)+strlen(key)+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 *line3 = (char *)malloc(sizeof(char) * len3);
......@@ -52,17 +56,38 @@ char * toXML(char *reqType, char *key, char * value){
strcat(line4,line42);
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);
strcpy(message,line1);
strcat(message,line2);
strcat(message,line3);
if(!strcmp(reqType,"putreq") || !strcmp(reqType,"resp"))
strcat(message,line4);
if (ip!=NULL)
{
strcat(message,line6);
free(line6);
}
strcat(message,line5);
free(line2);free(line3);free(line4);
printf("Message%s",message);
return message;
}
......@@ -154,7 +179,27 @@ extReq_t *extractXML(char *buffer){
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;
return req;
}
// 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 {
char* val;
char* operation;
char* err;
char ipAddr[16];
int port;
bool error;
};
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);
char *toRespXML(char* msg);
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){
if (ip!=NULL)
{
strcat(message,line6);
free(line6);
}
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