1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 18:18:12 +00:00

Userland+LibC: Add a new little "tc" program for testing TCP.

Also added send() and recv() to LibC in support of this. They are just
wrappers around sendto() and recvfrom().
This commit is contained in:
Andreas Kling 2019-03-13 17:33:40 +01:00
parent c588653f76
commit 7aba68d51c
6 changed files with 91 additions and 0 deletions

73
Userland/tc.cpp Normal file
View file

@ -0,0 +1,73 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, char** argv)
{
const char* addr_str = "127.0.0.1";
if (argc > 1)
addr_str = argv[1];
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
perror("socket");
return 1;
}
struct timeval timeout { 3, 0 };
int rc = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
if (rc < 0) {
perror("setsockopt");
return 1;
}
rc = setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
if (rc < 0) {
perror("setsockopt");
return 1;
}
struct sockaddr_in dst_addr;
memset(&dst_addr, 0, sizeof(dst_addr));
dst_addr.sin_family = AF_INET;
dst_addr.sin_port = htons(8080);
rc = inet_pton(AF_INET, addr_str, &dst_addr.sin_addr);
if (rc < 0) {
perror("inet_pton");
return 1;
}
rc = connect(fd, (struct sockaddr*)&dst_addr, sizeof(dst_addr));
if (rc < 0) {
perror("connect");
return 1;
}
char buffer[BUFSIZ];
const char* msg = "Test message";
send(fd, (const char*)msg, strlen(msg), 0);
printf("Message sent.\n");
struct sockaddr_in src_addr;
socklen_t src_addr_len = sizeof(src_addr);
ssize_t nrecv = recv(fd, buffer, sizeof(buffer), 0);
if (nrecv < 0) {
perror("recvfrom");
return 1;
}
buffer[nrecv] = '\0';
printf("Server: %s\n", buffer);
rc = close(fd);
if (rc < 0) {
perror("close");
return 1;
}
return 0;
}