diff --git a/src/tests/kits/net/Jamfile b/src/tests/kits/net/Jamfile index 53980f007e..1e82918593 100644 --- a/src/tests/kits/net/Jamfile +++ b/src/tests/kits/net/Jamfile @@ -5,6 +5,7 @@ SetSubDirSupportedPlatformsBeOSCompatible ; SimpleTest firefox_crash : firefox_crash.cpp : $(TARGET_NETWORK_LIBS) ; SimpleTest udp_client : udp_client.c : $(TARGET_NETWORK_LIBS) ; +SimpleTest udp_connect : udp_connect.cpp : $(TARGET_NETWORK_LIBS) ; SimpleTest udp_echo : udp_echo.c : $(TARGET_NETWORK_LIBS) ; SimpleTest udp_server : udp_server.c : $(TARGET_NETWORK_LIBS) ; diff --git a/src/tests/kits/net/udp_connect.cpp b/src/tests/kits/net/udp_connect.cpp new file mode 100644 index 0000000000..dc4b39ce93 --- /dev/null +++ b/src/tests/kits/net/udp_connect.cpp @@ -0,0 +1,90 @@ +/* + * Copyright 2010, Axel Dörfler, axeld@pinc-software.de. + * This file may be used under the terms of the MIT License. + */ + + +#include +#include +#include +#include +#include +#include + + +static bool sReceiveMode = false; + + +int +main(int argc, char** argv) +{ + const char* peerAddress = "192.168.0.1"; + if (argc > 1) + peerAddress = argv[1]; + + if (argc > 2 && !strcmp(argv[2], "recv")) + sReceiveMode = true; + + int fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + return 1; + +#if 1 + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons(sReceiveMode ? 8888 : 0); + if (bind(fd, (sockaddr*)&addr, sizeof(addr)) != 0) + perror("bind"); + + sockaddr ours; + socklen_t ourLength = sizeof(sockaddr); + if (getsockname(fd, &ours, &ourLength) != 0) + perror("getsockname"); + else { + printf("After bind: local address %s (%u)\n", + inet_ntoa(((sockaddr_in&)ours).sin_addr), + ntohs(((sockaddr_in&)ours).sin_port)); + } +#endif + + if (!sReceiveMode) { + sockaddr_in peer; + peer.sin_family = AF_INET; + peer.sin_addr.s_addr = inet_addr(peerAddress); + peer.sin_port = htons(sReceiveMode ? 0 : 8888); + if (connect(fd, (sockaddr*)&peer, sizeof(peer)) != 0) + perror("connect"); + + ourLength = sizeof(sockaddr); + if (getsockname(fd, &ours, &ourLength) != 0) + perror("getsockname"); + else { + printf("After connect: local address %s (%u)\n", + inet_ntoa(((sockaddr_in&)ours).sin_addr), + ntohs(((sockaddr_in&)ours).sin_port)); + } + } + + char buffer[256]; + if (sReceiveMode) { + ssize_t bytesReceived = recv(fd, buffer, sizeof(buffer), 0); + if (bytesReceived > 0) { + buffer[bytesReceived] = 0; + printf("received: %s\n", buffer); + } else + perror("recv"); + } else { + if (argc > 2) + send(fd, argv[2], strlen(argv[2]), 0); + else { + fgets(buffer, sizeof(buffer), stdin); + send(fd, buffer, strlen(buffer), 0); + } + } + + close(fd); + return 0; +} + +