// gcc testNonBlocking_raccept.c -lrdmacm -lpthread -o testNonBlocking_raccept #include #include #include #include #include #include #include #include static const char* hostname = "10.0.2.15"; // << INSERT YOUR IP HERE static int port; void *connecting_side_function(void *ptr) { int rs, ret; struct sockaddr_in addr; rs = rsocket(AF_INET, SOCK_STREAM, 0); if (rs < 0) perror("rsocket connecting-side"); 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"); fprintf(stdout, "\nconnecting to %s:%d \n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); ret = rconnect(rs, (struct sockaddr *)&addr, sizeof(struct sockaddr)); if (ret < 0) { perror("rconnect"); exit(3); } fprintf(stdout, "\nconnected"); usleep(100000); // just wait } 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)); // Configure the listening socket to be non-blocking rfcntl(rs1, F_SETFL, (rfcntl(rs2, F_GETFL) | O_NONBLOCK)); // Start the connecting thread pthread_create(&thread, NULL, connecting_side_function, (void*) NULL); while (1) { rs2 = raccept(rs1, (struct sockaddr *)&addr2, &addr_len); if (rs2 >= 0) { fprintf(stdout, "\naccepted rs2: %d ", rs2); break; } else if (rs2 < 0 && !(errno == EAGAIN || errno == EWOULDBLOCK)) { perror("raccept"); exit(1); } usleep(50*100); } // Configure the accepted socket to be blocking rfcntl(rs1, F_SETFL, (rfcntl(rs2, F_GETFL) & ~O_NONBLOCK)); //usleep(10*100); // if you wait a little all is ok!!! fprintf(stdout, "\nreading ..."); fflush(stdout); ret = rread(rs2, buffer, 255); if (ret < 0) { fprintf(stdout, "\nrread returned: %d, errno: %d ", ret, errno); perror("rread"); } else { fprintf(stdout, "\nrread returned: %d ", ret); } }