1 #include <sys/socket.h>
2 #include <netinet/in.h>
5 #include "addUdpEnhance.h"
7 /************************
9 ***********************/
12 int createUdpSocket() {
14 struct sockaddr_in clientaddr;
17 if((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
18 perror("socket creation failed");
21 if((setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on))) < 0) {
22 perror("setsockopt - SOL_SOCKET");
31 struct sockaddr_in servaddr;
33 //Create Global Udp Socket
34 if((udpSockFd = createUdpSocket()) < 0) {
35 printf("Error in socket\n");
38 sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
44 if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &setsockflag, sizeof(setsockflag)) < 0) {
50 if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &setsockflag, sizeof(setsockflag)) < 0) {
56 bzero(&servaddr, sizeof(servaddr));
57 servaddr.sin_family = AF_INET;
58 servaddr.sin_port = htons(UDP_PORT);
59 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
61 if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
69 void *udpListenBroadcast(void *sockfd) {
70 pthread_t thread_udpBroadcast;
71 struct sockaddr_in servaddr;
72 char readBuffer[MAX_SIZE];
73 socklen_t socklen = sizeof(struct sockaddr);
76 memset(readBuffer, 0, MAX_SIZE);
77 printf("Listening on port %d, fd = %d\n", UDP_PORT, (int)sockfd);
80 //int bytesRcvd = recvfrom((int)sockfd, readBuffer, 5, 0, NULL, NULL);
81 int bytesRcvd = recvfrom((int)sockfd, readBuffer, strlen(readBuffer), 0, (struct sockaddr *)&servaddr, &socklen);
87 printf("DEBUG-> Recv Error! \n");
91 short status = *((short *) &readBuffer[0]);
94 if((retval = invalidateFromPrefetchCache(readBuffer))!= 0) {
95 printf("Error: In invalidateFromPrefetchCache() at %s, %d\n", __FILE__, __LINE__);
100 printf("Error: Cannot regcognize the status in file %s, at line %d\n", __FILE__, __LINE__);
105 /* Close connection */
106 if(close((int)sockfd) == -1)
111 /* Function that sends a broadcast to Invalidate objects that
112 * have been currently modified */
113 int invalidateObj(thread_data_array_t *tdata) {
114 struct sockaddr_in clientaddr;
115 //TODO Instead of sending "hello" send modified objects
116 char writeBuffer[MAX_SIZE];
117 //char writeBuffer[] = "hello";
120 bzero(&clientaddr, sizeof(clientaddr));
121 clientaddr.sin_family = AF_INET;
122 clientaddr.sin_port = htons(UDP_PORT);
123 clientaddr.sin_addr.s_addr = INADDR_BROADCAST;
124 /* Create Udp Message */
126 *((short *)&writeBuffer[0]) = INVALIDATE_OBJS;
127 offset += sizeof(short);
128 *((short *) (writeBuffer+offset)) = (short) (sizeof(unsigned int) * (tdata->buffer->f.nummod));
129 offset += sizeof(short);
131 for(i = 0; i < tdata->buffer->f.nummod; i++) {
132 if(offset == MAX_SIZE) {
133 if((n = sendto(udpSockFd, (const void *) writeBuffer, strlen(writeBuffer), 0, (const struct sockaddr *)&clientaddr, sizeof(clientaddr))) < 0) {
134 perror("sendto error- ");
135 printf("DEBUG-> sendto error: errorno %d\n", errno);
141 if(offset >= MAX_SIZE) {
142 printf("DEBUG-> Large number of objects for one udp message\n");
147 *((unsigned int *) (writeBuffer+offset)) = tdata->buffer->oidmod[i];
148 offset += sizeof(unsigned int);
151 if((n = sendto(udpSockFd, (const void *) writeBuffer, strlen(writeBuffer), 0, (const struct sockaddr *)&clientaddr, sizeof(clientaddr))) < 0) {
152 perror("sendto error- ");
153 printf("DEBUG-> sendto error: errorno %d\n", errno);
156 //printf("DEBUG-> Client sending: %d bytes, %s\n", n, writeBuffer);
160 int invalidateFromPrefetchCache(char *buffer) {
161 int offset = sizeof(int);
162 /* Read objects sent */
163 int numObjs = *((short *)(buffer+offset)) / sizeof(unsigned int);
165 for(i = 0; i < numObjs; i++) {
167 oid = *((unsigned int *)(buffer+offset));
169 /* Lookup Objects in prefetch cache and remove them */
170 if((header = prehashSearch(oid)) != NULL) {
173 offset += sizeof(unsigned int);