Endereço IP para Broadcast:
// 255.255.255.255
serv_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
Ativar o envio para toda a gente:
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST (SO_RCVTIMEO), (char *)&opt, sizeof(opt));
Iniciar winsocks:
WSAStartup(MAKEWORD(2,2), &wsadata);
Criar socket:
SOCKET(PF_INET, SOCK_DGRAM, 0);
// Erro -> INVALID_SOCKET
Associar socket ao endereço de escuta (recebe datagramas de qualquer interface na porta pretendida):
memset((char*)&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(...); //inet_addr(...) //string
serv_addr.sin_port = htons(...); //int
Definir timeout:
struct timeval timeout;
timeout.tv_sec = TIMEOUT;
timeout.tv_usec = 0;
Enviar datagramas:
// enviar -> socket, valor a enviar(smp fazer a conversao), tamanho do var a enviar, para onde enviar, tamanho
sendto(sockfd, (char*)&sentValue, sizeof(sentValuue), (struct sockaddr*)&serv_addr, sizeof(serv_addr))
// Erro -> SOCKET_ERROR
Receber datagramas:
//receber -> socket, valor a enviar(smp fazer a conversao), tamanho do var a enviar, para onde enviar, tamanho
nbytes = recvfrom(sockfd, receber, sizeof(response), 0, (struct sockaddr *)&serv_addr, &size);
// Erro -> SOCKET_ERROR
Ver timeout:
WSAGetLastError() == WSAETIMEDOUT;
Terminar uma string:
response[nbytes] = '\0';
Fechar socket:
closesocket(sockfd);
Por o valor total na variável response:
sprintf(response, "Sum of values: %lf", total);
sprintf_s(response, sizeof(response), "Sum of values: %lf", total);
Verificar se a mensagem recebida foi enviada pelos servidor e não um impostor:
if (strcmp(inet_ntoa(addr.sin_addr), inet_ntoa(serv_addr.sin_addr)) && atoi(itoa(addr.sin_port==serv_addr.sin_port)))