Jasiek_M Napisano Czerwiec 11, 2011 Zgłoszenie Share Napisano Czerwiec 11, 2011 Witam, Mam bardzo prosty problem którego rozwiazania jednak nie moge znalezc- mianowicie przy jakiejkolwiek próbie bindowania gniazd wyskakuje komunikat "Address already in use" oczywiscie próbowalem róznych portów, ba na uczelni ten sam kod chodzi, u znajomych równiez tylko u mnie sa problemy. Podejrzewam ze SeLinux blokuje porty-co o tym myslicie? Bardzo prosze o szybka pomoc bo musze napisac pilnie pewien program na uczelnie... W razie watpliwosci wrzucam przykladowy najprostszy kod który zdazylem napisac na uczelni jeszcze: Klient: #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <sys/types.h> #include <arpa/inet.h> int socketFd; struct sockaddr_in mojAddr, doKogoAddr; char wysylkoweIp2[20] = "127.0.0.1"; int main(){ char bufor[50]; int numbytes; socketFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(socketFd == -1){ puts("nie mozna stworzyc gniazda"); perror("socket: "); return -1; } doKogoAddr.sin_family = AF_INET; doKogoAddr.sin_port = htons(33601); doKogoAddr.sin_addr.s_addr = inet_addr(wysylkoweIp2); if ( connect(socketFd, (struct sockaddr*)&doKogoAddr, sizeof(struct sockaddr)) == -1){ printf ("Nieudana proba polaczenia!\n"); perror("connect: "); close(socketFd); return -1; } else printf("Polaczenie nawiazane poprawnie\n"); puts("podaj tekst do wyslania - q wychodzi"); while(1){ scanf("%s",bufor); numbytes = send(socketFd, bufor, 49, 0); if (bufor[0] == 'q') break; } // printf("wyslano %d bajtow!\n", numbytes); close(socketFd); return 0; } Serwer: #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <sys/types.h> #include <arpa/inet.h> int socketFd, socketFdAccept; struct sockaddr_in mojAddr, odKogoAddr; char mojeIp[20] = "95.49.132.180"; char mojeIp2[20] = "127.0.0.1"; char wysylkoweIp[20] = "95.49.132.180"; char wysylkoweIp2[20] = "127.0.0.1"; int main(){ socklen_t _size; char bufor[50]; int numbytes; socketFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(socketFd == -1){ puts("nie mozna stworzyc gniazda"); perror("socket: "); return -1; } mojAddr.sin_family = AF_INET; mojAddr.sin_port = htons(33601);//wlasny port //mojAddr.sin_port = 0; //automatyczny wybor wolnego //mojAddr.sin_addr.s_addr = htonl(INADDR_ANY); //sam wybiera nasz adres ip mojAddr.sin_addr.s_addr = inet_addr(mojeIp2); //wlasne wpisanie; if ( (bind(socketFd, (struct sockaddr*)&mojAddr, sizeof(struct sockaddr))) == -1){ printf("Nie mozna skonfigurowac gniazda\n"); close(socketFd); perror("bind: "); } if(listen(socketFd, SOMAXCONN) == -1) { printf("Nie mozna nasluchiwac\n"); close(socketFd); perror("listen: "); } printf("Oczekuje na polaczenie...\n"); _size = sizeof(struct sockaddr_in); socketFdAccept = accept (socketFd, (struct sockaddr*)&odKogoAddr, &_size); if(socketFdAccept == -1){ printf ("Nieudana proba polaczenia!\n"); close(socketFd); close(socketFdAccept); perror("accept: "); return -1; } else printf("Polaczenie nawiazane poprawnie\n"); while(1){ numbytes = recv(socketFdAccept, bufor, 49, 0); if (bufor[0] == 'q') break; printf("%s\n", bufor); } printf("Adres IP i port nadawcy: %s:%d\n", inet_ntoa(odKogoAddr.sin_addr),htons(odKogoAddr.sin_port)); //printf("Odebrana wiadomosc: %s\n",bufor); close(socketFd); close(socketFdAccept); //printf("odebrano %d bajtow!\n", numbytes); return 0; } Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
@WalDo Napisano Czerwiec 11, 2011 Zgłoszenie Share Napisano Czerwiec 11, 2011 Po co pytasz? Nie prościej wyłączyć na chwilę SElinux i sprawdzić czy program się uruchamia? Albo choćby przestawić na jakiś czas w tryb permissive setenforce 0 oczywiście jako root. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Jasiek_M Napisano Czerwiec 11, 2011 Autor Zgłoszenie Share Napisano Czerwiec 11, 2011 Po co pytasz? Nie prosciej wylaczyc na chwile SElinux i sprawdzic czy program sie uruchamia? Albo chocby przestawic na jakis czas w tryb permissive setenforce 0 oczywiscie jako root. Ok, a potem jak wrócic do poprzednich ustawien by komputer nie byl zbyt dlugo nie chroniony- setenforce 1? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
@WalDo Napisano Czerwiec 11, 2011 Zgłoszenie Share Napisano Czerwiec 11, 2011 setenforce 1?Dokładnie tak. W takich wypadkach zawsze (prawie zawsze) sprawdza się "man <polecenie>", np. man setenforce Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się