Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdio.h>
- #include<pthread.h>
- #define ST_PORT 9998
- #pragma comment (lib, "Ws2_32.lib")
- #pragma comment (lib, "Mswsock.lib")
- #pragma comment (lib, "AdvApi32.lib")
- typedef struct lista{
- int si;
- pthread_t watek;
- int nr;
- struct lista* next;
- } lista;
- struct dane_dla_watku // tablica zawiera dane , ktore otrzymaja watki
- {
- lista *head;
- int *si;
- int* user;
- }dane_dla_watku;
- //pthread_t ghMutex;
- pthread_mutex_t mutex;
- void* funkcja_watku(void *arg);
- int main() {
- /*WSADATA wsas;
- int result;
- WORD wersja;
- wersja = MAKEWORD(1, 1);
- result = WSAStartup(wersja, &wsas);
- int s;
- s = socket(AF_INET, SOCK_STREAM, 0);*/
- int s, newsockfd, portno;
- socklen_t clilen;
- char buffer[256];
- s = socket(AF_INET, SOCK_STREAM, 0);
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- /*struct sockaddr_in sa;
- memset((void *)(&sa), 0, sizeof(sa));
- sa.sin_family = AF_INET;
- sa.sin_port = htons(ST_PORT);
- sa.sin_addr.s_addr = htonl(INADDR_ANY);
- result = bind(s, (struct sockaddr FAR *) & sa, sizeof(sa));
- result = listen(s, 5);*/
- struct sockaddr_in sa;
- bzero((char *) &sa, sizeof(sa));
- sa.sin_family = AF_INET;
- sa.sin_addr.s_addr = INADDR_ANY;
- sa.sin_port = htons(9998);
- bind(s, (struct sockaddr *) &sa,sizeof(sa));
- listen(s,5);
- //---------------------------------
- int licz_watk = 0;
- struct sockaddr_in sc;
- int lenc;
- lista* head = NULL;
- /*ghMutex = CreateMutex(NULL, FALSE, NULL);
- if (ghMutex == NULL)
- {
- printf("CreateMutex error: %d\n", GetLastError());
- return 1;
- }*/
- pthread_mutexattr_init(&mutex);
- for (;;)
- {
- lenc = sizeof(sc);
- int tmpS = accept(s, (struct sockaddr *) & sc, &lenc);
- lista* el_listy = malloc(sizeof(lista));
- el_listy->next = NULL;
- lista* tmp = head;
- if (tmp == NULL)
- {
- el_listy->nr = 1;
- head = el_listy;
- }
- else
- {
- while (tmp->next != NULL)
- {
- tmp = tmp->next;
- }
- el_listy->nr = tmp->nr + 1;
- tmp->next = el_listy;
- }
- el_listy->si = tmpS;
- struct dane_dla_watku dane={ head, &el_listy->si, &el_listy->nr };
- int err = pthread_create(&el_listy->watek,NULL, funkcja_watku, (void *)(&dane));
- if (err != 0){
- printf("\ncan't create thread :[%s]", strerror(err));
- }
- else{
- printf("\n Thread created successfully\n");
- }
- }
- /*WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);
- for (int i = 0; i < THREADCOUNT; i++)
- CloseHandle(aThread[i]);*/
- pthread_mutexattr_destroy(&mutex);
- return 0;
- }
- void* funkcja_watku(void *arg)
- {
- char buf[80];
- struct dane_dla_watku *dn = (struct dane_dla_watku*)arg;
- int *sia = dn->si;
- lista *tmp = dn->head;
- char usernum = *(dn->user) + '0';
- char hello[40] = "Uzytkownik";
- int dlug2 = strlen(hello);
- hello[dlug2] = usernum;
- strcat(hello, " sie polaczyl.");
- dlug2 = strlen(hello);
- hello[dlug2] = '\0';
- while (tmp != NULL)
- {
- send(tmp->si, hello, dlug2+1, 0);
- tmp = tmp->next;
- }
- while (1) {
- while (recv(*sia, buf, 80, 0) > 0)
- {
- //WaitForSingleObject(ghMutex, INFINITE);
- pthread_mutex_lock(&mutex);
- if (strcmp(buf, "KONIEC") == 0)
- {
- printf("koniec");
- //closesocket(sia);
- //WSACleanup();
- return;
- }
- char bufuser[100] = "Uzytkownik";
- int dlug2 = strlen(bufuser);
- bufuser[dlug2] = usernum;
- strcat(bufuser, ": ");
- strcat(bufuser, buf);
- lista *tmp = dn->head;
- while (tmp != NULL)
- {
- dlug2 = strlen(bufuser);
- bufuser[dlug2] = '\0';
- send(tmp->si, bufuser, dlug2+1, 0);
- tmp = tmp->next;
- }
- printf("%s\n", buf);
- //ReleaseMutex(ghMutex);
- pthread_mutex_unlock(&mutex);
- };
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement