#include #include #include #include #include #include #include #include #include #include #include #define PORT_THIS 5556 #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; 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; addr_this.sin_family = AF_INET; addr_this.sin_addr.s_addr = INADDR_ANY; // любой интерфейс на нашей станции addr_this.sin_port = htons(PORT_THIS); // Создаем UDP сокет. sock = socket(PF_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); } // формируем сообщение - читаем с клавиатуры printf("Your message: "); fgets(buf, BUFLEN, stdin); size = strlen(buf); // отсылаем nbytes = sendto(sock, buf, strlen(buf)+1, 0, (struct sockaddr*)&addr_to, sizeof(addr_to)); //PrintAddr(addr_to, "sending to\n"); 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); } // читаем и печатаем ответ size = sizeof(addr_from); nbytes = recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr*)&addr_from, &size); PrintAddr(addr_from,"get message from\n"); printf("%d bytes :\n%s\n", nbytes, buf); // работа закончена 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)); }