J'ai regardé autour sans succès sur comment faire pour que le client reçoive des demandes du serveur sans bloquer la boucle principale, je m'excuse s'il y a un double là-bas, mais tout ce que j'ai trouvé en ligne sont des versions de TCP, qui ne fonctionnent pas pour mon but (UDP). En ce moment, le serveur est juste un serveur Echo, donc je m'en fous si ça bloque.C Socket UDP non bloquante
Le serveur est créé comme suit
ServerInstance Init(ServerConfiguration c) {
ServerInstance n;
n.endpoint = socket(PF_INET, SOCK_DGRAM, 0);
Exitif(n.endpoint < 0, "Error opening endpoint socket");
setsockopt(n.endpoint, SOL_SOCKET, SO_REUSEADDR, (const void *) &c.trueval, sizeof(int));
setzero((char *) &n.servaddr, sizeof(n.servaddr));
n.servaddr.sin_family = AF_INET;
n.servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
n.servaddr.sin_port = htons(c.portno);
Exitif(bind(n.endpoint, (struct sockaddr *) &n.servaddr, sizeof(n.servaddr)) < 0,
"Error on binding socket to addr");
n.buf = calloc(c.buffersize, sizeof(char))
return n;
}
En ce qui concerne le client:
connection = socket(AF_INET, SOCK_DGRAM, 0);
IfThenExit(socket < 0, "Error initializing UDP socket\n");
setzero((char *) &servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
IfThenExit(inet_aton(SRVADDR, &servaddr.sin_addr) == 0, "IPV4 Address Invalid\n");
CleanQueueAdd(&connection, Socket);
Et des boucles comme ci-dessus, j'ai aussi piscine d'événements de SDL, et je voudrais savoir comment je peux mettre en œuvre quelque chose comme ça sans bloquer le programme
if(1) {
while(SDL_PollEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
quit = 1;
break;
case SDL_KEYDOWN:
quit = 1;
break;
}
}
// Recv here blocks ...
// recv(...)
}
Merci d'avoir lu et d'avoir un nice day
Quel est le protocole utilisé par la connexion réseau utilisée par les références de socket n'a aucun effet sur la façon de définir un socket non bloquant et de l'utiliser. L'interface de socket est indépendante du protocole réseau. –
Vous avez deux options. Je m'attends à voir un code qui 1/définit le mode socket à non bloquant, ou 2/appelle des fonctions de socket en utilisant des options pour spécifier des appels non bloquants ... mais je ne vois aucun de ces deux ... et donc je vote fermer. – Sebivor
@Seb J'ai mis le socket en mode non-bloquant après avoir posé cette question, mais est-ce optimal par rapport à poll ou select? Je lis les cycles CPU gaspillés – Whiteclaws