#include #include #include #include #include #include #include #include #include #include #include void PrintAddr(const struct sockaddr_in &addr, const char *text); #define PORT 5555 #define BUFLEN 512 char buf[BUFLEN]; void ProcessRequestst (int sock); int main(void) { int sock; int nbytes, i, err; unsigned int size; struct sockaddr_in addr_from; // откуда пришло struct sockaddr_in addr_this; // для входящих запросов struct hostent *hostinfo; addr_this.sin_family = AF_INET; addr_this.sin_addr.s_addr = INADDR_ANY; addr_this.sin_port = htons(PORT); // Создаем 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); } // принимаем сообщение и отвечаем на него ProcessRequestst (sock); 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)); } void ProcessRequestst (int sock) { socklen_t size; int nbytes; struct sockaddr_in addr_from; while (true) { // читаем сообщение 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); // формируем ответ strcat(buf, " Echo"); // отсылаем ответ nbytes = sendto(sock, buf, strlen(buf)+1, 0, (struct sockaddr*)&addr_from, sizeof(addr_from)); if( nbytes<0 ) { fprintf(stderr,"cannot send data\n"); close(sock); exit (EXIT_FAILURE); } else { printf("sending message of %d bytes\n", nbytes); } } }