1*b761f925SJérôme Duval #include <stdio.h>
2*b761f925SJérôme Duval #include <stdlib.h>
3*b761f925SJérôme Duval #include <sys/socket.h>
4*b761f925SJérôme Duval #include <stdbool.h>
5*b761f925SJérôme Duval
main()6*b761f925SJérôme Duval int main() {
7*b761f925SJérôme Duval int fds[2];
8*b761f925SJérôme Duval int domain;
9*b761f925SJérôme Duval domain = AF_UNIX;
10*b761f925SJérôme Duval // domain = AF_INET; // works
11*b761f925SJérôme Duval printf("Domain: %i\n", domain);
12*b761f925SJérôme Duval int ret = socketpair(domain, SOCK_DGRAM, 0, fds); // try also: SOCK_STREAM
13*b761f925SJérôme Duval if(ret) {
14*b761f925SJérôme Duval perror("Could not get socketpair");
15*b761f925SJérôme Duval return 1;
16*b761f925SJérôme Duval }
17*b761f925SJérôme Duval
18*b761f925SJérôme Duval /*
19*b761f925SJérôme Duval struct timeval v = {
20*b761f925SJérôme Duval .tv_sec = 1,
21*b761f925SJérôme Duval .tv_usec = 0
22*b761f925SJérôme Duval };
23*b761f925SJérôme Duval ret = setsockopt(fds[0], SOL_SOCKET, SO_RCVTIMEO, &v, sizeof(v));
24*b761f925SJérôme Duval if(ret) {
25*b761f925SJérôme Duval perror("setsockopt");
26*b761f925SJérôme Duval }
27*b761f925SJérôme Duval */
28*b761f925SJérôme Duval
29*b761f925SJérôme Duval size_t bufLen = 1024;
30*b761f925SJérôme Duval char *buf = calloc(bufLen, 1);
31*b761f925SJérôme Duval int ok = 0;
32*b761f925SJérôme Duval while(true) {
33*b761f925SJérôme Duval printf("recv %i\n", ok);
34*b761f925SJérôme Duval ret = recv(fds[0], &buf[0], bufLen, MSG_DONTWAIT);
35*b761f925SJérôme Duval // expected: EWOULDBLOCK/EAGAIN (on Linux, macOS, Haiku)
36*b761f925SJérôme Duval printf("%i\n", ret);
37*b761f925SJérôme Duval if(ret < 0) {
38*b761f925SJérôme Duval perror("recv");
39*b761f925SJérôme Duval break;
40*b761f925SJérôme Duval } else {
41*b761f925SJérôme Duval ok++;
42*b761f925SJérôme Duval }
43*b761f925SJérôme Duval }
44*b761f925SJérôme Duval
45*b761f925SJérôme Duval return 0;
46*b761f925SJérôme Duval }
47