#include #include #include #include #include #include #include #include #include #include #include void PrintAddr(const sockaddr_in &addr, const char *text); #define PORT 5555 #define BUFLEN 512 char buf[BUFLEN]; int main(void) { int sock; int nbytes, i, err; unsigned int size; sockaddr_in addr_from; // откуда пришло sockaddr_in addr_this; // свой адрес hostent *hostinfo; hostinfo = gethostbyname("127.0.0.1"); if ( hostinfo==NULL ) { fprintf (stderr, "Unknown host\n"); exit (EXIT_FAILURE); } addr_this.sin_family = AF_INET; addr_this.sin_addr.s_addr = INADDR_ANY; addr_this.sin_port = htons(PORT); // Создаем 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, (sockaddr*)&addr_this, sizeof(addr_this)); if ( err<0 ) { perror ("Client: cannot bind socket"); exit (EXIT_FAILURE); } // ждем до прихода внешнего сообщения size = sizeof(addr_from); nbytes = recvfrom(sock, buf, BUFLEN, 0, (sockaddr*)&addr_from, &size); PrintAddr(addr_from, "get message from\n"); printf("%d bytes:\n%s\n", nbytes, buf); // формируем ответ strcat(buf, " Echo"); // отсылаем ответ nbytes = sendto(sock, buf, strlen(buf)+1, 0, (sockaddr*)&addr_from, sizeof(addr_from)); // проверяем как отослалось 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); } // конец работы 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)); }