私は、メインループをブロックせずにクライアントからサーバからのリクエストを受信する方法については役に立たないと考えていましたが、そこに重複がある場合は謝罪しますが、私の目的(UDP)では動作しないTCPバージョンです。CノンブロッキングUDPソケット
現在、サーバーはエコーサーバーなので、ブロックするかどうかは気にしません。
サーバーがクライアントについては
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;
}
を次のように作成されます。
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);
そして、それは上記のようにループし、私はまた、SDLのイベントプールを持っている、と私は知りたいのですがどのように私はプログラムをブロックすることなくそのようなものを実装することができます
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(...)
}
ありがとう、読んでいただきありがとうございます良い日
ソケットが参照しているネットワーク接続がどのプロトコルを使用しているかは、どのようにソケットを非ブロッキングにして使用するかには影響しません。ソケットインタフェースはネットワークプロトコルに依存しません。 –
2つのオプションがあります。私は1 /ソケットモードをノンブロッキングに設定するコード、または2 /ノンブロッキングコールを指定するオプションを使用してソケット関数を呼び出すコードを見ることを期待しています...しかし、私はこれら2つのどれも見ることができません。閉じる。 – Sebivor
@Seb私はこの質問をした後、ソケットを非ブロッキングモードに設定しましたが、ポーリングや選択に比べて最適ですか?私はCPUサイクルを浪費して読んでいます。 – Whiteclaws