ee w zasadzie mogłem więcej napisać.
To tak myślę że ten fragment powinien wystarczyć. Zaczyna się konstruktor klasy a potem metoda główna zaczyna obroty pętli głównej:
[code]
FD_ZERO(& master); // wyczyść główny i pomocniczy zestaw
FD_ZERO(& read_fds);
// utwórz gniazdo nasłuchująceo
if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
// zgub wkurzający komunikat błędu "address already in use"
if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, & yes,
sizeof ( int)) == -1) {
perror("setsockopt");
exit(1);
}
// bind
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = INADDR_ANY;
myaddr.sin_port = htons(PORT);
memset(&(myaddr.sin_zero), '\0', 8);
if (bind(listener, (struct sockaddr *) & myaddr, sizeof ( myaddr)) == -1) {
perror("bind");
exit(1);
}
// listen
if (listen(listener, 10) == -1) {
perror("listen");
exit(1);
}
// dodaj gniazdo nasłuchujące do głównego zestawu
FD_SET(listener, & master);
// śledź najwyższy numer deskryptora pliku
fdmax = listener; // póki co, ten jest największy
}
void Socket::start() {
std::cout << "MAIN METHOD" << std::endl;
// FOREVER
while (true) {
std::cout << "main loop: "<< std::endl;
read_fds = master; // copy it
if (select(fdmax + 1, & read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(1);
}
printf("Select was catch activity\n");
// przejdź przez obecne połączenia szukając danych do odczytania
for (i = 0; i <= fdmax; i++) {
fcntl(i,F_SETFL,O_NONBLOCK);
//std::cout << "here" << std::endl;
if (FD_ISSET(i, & read_fds)) { // mamy jednego!!
#ifdef _DEBUG
printf("we've got one\n");
#endif
if (i == listener) {
// obsłuż nowe połączenie
addrlen = sizeof ( remoteaddr);
if ((newfd = accept(listener, (struct sockaddr ) & remoteaddr,
& addrlen)) == -1) {
perror("accept");
} else {
FD_SET(newfd, & master); // dodaj do głównego zestawu
if (newfd > fdmax) { // śledź maksymalny
fdmax = newfd;
}
/
* WYSLAC LISTE KANALOW
/
int somesize ;
unsigned char * buffer = new unsigned char [120];
if((somesize = recv(newfd,buffer,1240,0)) <= 0 ) //don't receive dataas
perror("hash");
printf("%d receivrd %d bytes while getting the hash\n",newfd,nbytes);
[/code]
no i zawsze mam zero bajtow cokolwiek bym nie wyslal.
Mój program testujący jest w javie ale to nie powinno mieć znaczenia żadnego. Oto jego kod:
[code]
/
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package aaa;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*