#include /* printf */ #include /* socket, bind, listen */ #include /* htonl */ #include /* strcpy */ #include pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; char line[256]=""; void * udpMonitorServer( void * p_port) { int port = *((int *)p_port); int udpSocket, rc, len; struct sockaddr_in name, from; char buf[10]; udpSocket = socket(AF_INET, SOCK_DGRAM, 0); name.sin_family = AF_INET; name.sin_port = htons(port); name.sin_addr.s_addr = htonl(INADDR_ANY); len = sizeof(struct sockaddr_in); if( bind(udpSocket, (struct sockaddr *) &name, len)) printf("bind error"); len = sizeof(from); for(;;){ printf("\n... UDP server is waiting...\n"); if ((rc=recvfrom(udpSocket, buf, sizeof(buf), 0, (struct sockaddr *)&from, &len)) < 0) perror("receiving datagram message"); if ((rc > 0) && (buf[0]=='n') ){ pthread_mutex_lock(&mutex); if (sendto(udpSocket, line, strlen(line), 0,(struct sockaddr *) &from, sizeof(from)) <0 ) perror("sending line"); pthread_mutex_unlock(&mutex); } } } #include #include /* read, close */ #include /* exit */ int main(int argc, char *argv[]) { int port = atoi(argv[1]); pthread_t tid; int welcomeSocket, generatorSocket, len; struct sockaddr_in name; int n; char buff[buffSize]; pthread_create(&tid, NULL, udpMonitorServer, &port); welcomeSocket = socket(AF_INET, SOCK_STREAM, 0); name.sin_family = AF_INET; name.sin_port = htons(port); name.sin_addr.s_addr = htonl(INADDR_ANY); len = sizeof(struct sockaddr_in); if( bind(welcomeSocket, (struct sockaddr *) &name, len)) printf("bind error"); listen(welcomeSocket, 5); printf("\n... TCP server is waiting...\n"); generatorSocket = accept(welcomeSocket, (struct sockaddr *) &name, &len); do { n = read(generatorSocket, buff, sizeof(buff)); if (n > 0) { buff[n]='\0'; printf("\n... TCP server received:%s\n", buff); pthread_mutex_lock(&mutex); strcpy(line, buff); pthread_mutex_unlock(&mutex); } } while ( n > 0); close(generatorSocket); close(welcomeSocket); exit(0); }