Возможно ли перевести сетевой 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
#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
Комментариев нет:
Отправить комментарий