// gcc testBlocking_raccept.c -lrdmacm -o testBlocking_raccept #include #include #include #include #include #include #include #include static const char* hostname = "10.0.2.15"; // << INSERT YOUR IP HERE static int port; int initiate_connect() { int rs, ret; struct sockaddr_in addr; rs = rsocket(AF_INET, SOCK_STREAM, 0); if (rs < 0) { perror("rsocket connecting-side"); return -1; } // Configure the connecting socket to be non-blocking rfcntl(rs, F_SETFL, (rfcntl(rs, F_GETFL) | O_NONBLOCK)); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = port; ret = inet_aton(hostname, &addr.sin_addr); if (ret < 0) { perror("inet_aton"); return -1; } fprintf(stdout, "\nconnecting to %s:%d ", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); ret = rconnect(rs, (struct sockaddr *)&addr, sizeof(struct sockaddr)); if (ret < 0 && errno != EINPROGRESS) { perror("rconnect"); return -1; } fprintf(stdout, "\nconnect initiated "); fflush(stdout); return 0; } int main() { int rs1, rs2, ret; pthread_t thread; char buffer[256]; struct sockaddr_in addr, addr2; socklen_t addr_len = sizeof(addr); rs1 = rsocket(AF_INET, SOCK_STREAM, 0); if (rs1 < 0) perror("rsocket"); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); ret = rbind(rs1, (struct sockaddr *) &addr, addr_len); if (ret < 0) perror("rbind"); ret = rlisten(rs1, 10); if (ret < 0) perror("rlisten"); memset(&addr, 0, sizeof(addr)); if (rgetsockname(rs1, (struct sockaddr *) &addr, &addr_len) < 0) perror("rgetsockname"); port = addr.sin_port; fprintf(stdout, "\nlistening on port %d ", ntohs(port)); // Initiate the connecting side ret = initiate_connect(); if (ret < 0) exit(5); fprintf(stdout, "\naccepting ... "); fflush(stdout); rs2 = raccept(rs1, (struct sockaddr *)&addr2, &addr_len); if (rs2 >= 0) { fprintf(stdout, "\naccepted rs2: %d ", rs2); fflush(stdout); } else if (rs2 < 0 && !(errno == EAGAIN || errno == EWOULDBLOCK)) { perror("raccept"); exit(1); } }