#include #include #include #include #include #include #include #include #include #include #include #define PORT_TO 5555 // потр сервера #define BUFLEN 512 char buf[BUFLEN]; void PrintAddr(const struct sockaddr_in &addr, const char *text); int main(void) { int sock; int nbytes, i, err, myport; unsigned int size; struct sockaddr_in addr_to; // куда посылать struct sockaddr_in addr_from; // откуда пришло struct sockaddr_in addr_this; struct hostent *hostinfo; hostinfo = gethostbyname("127.0.0.1"); if ( hostinfo==NULL ) { fprintf (stderr, "Unknown host\n"); exit (EXIT_FAILURE); } // адресная информация про сервер addr_to.sin_family = hostinfo->h_addrtype; addr_to.sin_port = htons(PORT_TO); addr_to.sin_addr = *(struct in_addr*) hostinfo->h_addr; // рабочий порт клиента задается при его запуске printf("what port to use: "); scanf("%d", &myport); addr_this.sin_family = AF_INET; addr_this.sin_addr.s_addr = INADDR_ANY; addr_this.sin_port = htons(myport); // Создаем UDP сокет. sock = socket(AF_INET,SOCK_DGRAM,0); if ( sock<0 ) { perror ("Client: socket was not created"); exit (EXIT_FAILURE); } int opt = 1; setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,sizeof(opt)); // Привязываем сокет к сетевому интерфейсу нашей станции err = bind(sock, (struct sockaddr*)&addr_this, sizeof(addr_this)); if ( err<0 ) { perror ("Client: cannot bind socket"); exit (EXIT_FAILURE); } // формируем сообщение (по сути оно не нужно) только для регистрации strcpy(buf, "test"); size = strlen(buf); // отсылаем nbytes = sendto(sock, buf, strlen(buf)+1, 0, (struct sockaddr*)&addr_to, sizeof(addr_to)); if( nbytes<0 ) { fprintf(stderr,"cannot send data\n"); perror("Client"); close(sock); exit (EXIT_FAILURE); } else { printf("sending message of %d bytes\n", nbytes); } // отключаем блокировку чтения на сокете fcntl(sock, F_SETFL, O_NONBLOCK); // в цикле принимаем все сообщения - не более 20 секунд // 10000 раз по 2000 микросекунд for (int k=0; k<10000; k++) { size = sizeof(addr_from); nbytes = recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr*)&addr_from, &size); if (nbytes > 0) { printf("get message: %s\n", buf); k = 0; } // задержка проверки входящих сообщений usleep(2000); } printf("Timeout expired\n"); close(sock); return 0; } void PrintAddr(const struct sockaddr_in &addr, const char *text) { if (text) printf("%s", text); int f = addr.sin_family; int p = addr.sin_port; printf("type %d\n", f); printf("port %d\n", ntohs(p)); printf("ip addr %s\n", inet_ntoa(addr.sin_addr)); }