Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Асинхронный сокет

Возможно ли перевести сетевой Linux сокет в асинхронный режим работы? Желательно пример на Си или C++


Ответ

Что-то в таком духе.
signal(SIGIO, hsig); fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC); fcntl(fd, F_SETOWN, getpid());
Учтите (это я по аналогии с O_NONBLOCK), что уже dup-нутые дескрипторы даже в других процессах тоже станут асинхронными (впрочем, лучше проверьте это предупреждение).
UPD
#include #include #include #include
#include #include #include #include #include
#include #include
#include #include
#define fatal(msg) ({fprintf(stderr,"FATAL %ld: %s [%m]
",(long)getpid(),msg);\ exit(-1);})
void hsig (int s) { printf("catch %d (%s)
", s, strsignal(s)); }
// returns 1 OK, 0 ERR int make_ipaddr (char *host, int port, struct sockaddr_in *a) { struct hostent *phe;
a->sin_family = AF_INET; a->sin_port = htons(port); a->sin_addr.s_addr = INADDR_ANY;
if (host && host[0]) { if (phe = gethostbyname(host)) memcpy (&a->sin_addr, phe->h_addr, phe->h_length); else if ((a->sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) return 0; }
return 1; }
// returns socket int make_connect (struct sockaddr_in *addr) { int sock = socket(AF_INET,SOCK_STREAM,0), alen = sizeof(*addr), on = 1; struct linger ling; ling.l_onoff = 1; ling.l_linger = 0;
if (sock != -1 && setsockopt(sock,SOL_SOCKET,SO_REUSEADDR, (char *)&on, sizeof (on)) != -1 && setsockopt(sock,SOL_SOCKET,SO_LINGER, (char *)&ling,sizeof(ling)) != -1 && connect(sock,(struct sockaddr *)addr,alen) == 0) return sock; // OK // ERR return sock == -1? -1: close(sock),-1; }
int main (int ac, char *av[]) { struct sockaddr_in sadr; if (!make_ipaddr("localhost", atoi(av[1] ? av[1] : "1234"), &sadr)) fatal("make addr"); char buf[LINE_MAX];
int fd = make_connect(&sadr); if (fd < 0) fatal("connect");
signal(SIGIO, hsig); fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC); fcntl(fd, F_SETOWN, getpid());
puts("Ready"); getchar();
return puts("End") == EOF; }
Я соединялся этой программкой с nc -l localhost -p 1234

Комментариев нет:

Отправить комментарий