#define _GNU_SOURCE
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#ifdef _WIN32
#include <winsock.h>
#else
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#endif
void tcp_server(int port) {
[COLOR=seagreen]/* socket() - Socket anfordern */ int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket()");
exit(EXIT_FAILURE);
}
[COLOR=seagreen]/* bind() - Den eigenen Port festlegen */ struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind()");
}
[COLOR=seagreen]/* Zugewiesenen Port ermitteln: */ socklen_t len;
getsockname(sockfd, (struct sockaddr *)&my_addr, &len);
printf("Port: %d\n", ntohs(my_addr.sin_port));
[COLOR=seagreen]/* listen() - Auf eingehende Verbindungen warten */ if (listen(sockfd, 5) == -1) {
perror("listen()");
}
[COLOR=seagreen]/* accept() - Die eingehende Verbindung annehmen */ socklen_t sin_size = sizeof(struct sockaddr_in);
struct sockaddr_in remote_host;
int sock2 = accept(sockfd, (struct sockaddr *)&remote_host, &sin_size);
if (sock2 == -1) {
perror("accept()");
}
[COLOR=seagreen]/* recv() - Empfangen mit TCP */ ssize_t msg_length;
char buf[1024];
if ((msg_length = recv(sock2, buf, 1024, 0)) == -1) {
perror("recv()");
}
int i=0;
printf("message: ");
while (i<msg_length) {
printf("%c", buf[i]);
i++;
}
printf("\naccepted connection from [%s:%d]\n", inet_ntoa(remote_host.sin_addr), ntohs(remote_host.sin_port));
[COLOR=seagreen] /* close() - Socket freigeben */ int close(int sockfd);
}
void tcp_client(char *data, int port, char *server_ip) {
[COLOR=seagreen] /* socket() - Socket anfordern */ int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket()");
exit(EXIT_FAILURE);
}
[COLOR=seagreen]/* connect() - Verbindung aufbauen */ struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
inet_aton(server_ip, &serv_addr.sin_addr);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) {
perror("connect()");
}
[COLOR=seagreen]/* send() - Senden mit TCP */ char *msg = data;
int len = strlen(msg);
if (send(sockfd, msg, len, 0) == -1) {
perror("send()");
}
[COLOR=seagreen]/* close() - Socket freigeben */ int close(int sockfd);
}
void udp_server(int port) {
[COLOR=seagreen]/* socket() - Socket anfordern */ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket()");
exit(EXIT_FAILURE);
}
[COLOR=seagreen]/* bind() - Den eigenen Port festlegen */ struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind()");
}
[COLOR=seagreen] /* Zugewiesenen Port ermitteln: */ socklen_t len;
getsockname(sockfd, (struct sockaddr *)&my_addr, &len);
printf("Port: %d\n", ntohs(my_addr.sin_port));
[COLOR=seagreen]/* recvfrom() - Empfangen mit UDP */ ssize_t msg_length;
struct sockaddr_in remote_host;
socklen_t clientlen;
clientlen = sizeof(remote_host);
char buf[1024];
if ((msg_length = recvfrom(sockfd, buf, 1024, 0, (struct sockaddr *)&remote_host, &clientlen)) == -1) {
perror("recvfrom()");
}
int i=0;
printf("message: ");
while (i<msg_length) {
printf("%c", buf[i]);
i++;
}
printf("\naccepted connection from [%s:%d]\n", inet_ntoa(remote_host.sin_addr), ntohs(remote_host.sin_port));
[COLOR=seagreen]/* close() - Socket freigeben */ int close(int sockfd);
}
void udp_client(char *data, int port, char *server_ip) {
[COLOR=seagreen]/* socket() - Socket anfordern */ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket()");
exit(EXIT_FAILURE);
}
[COLOR=seagreen]/* sendto() - Senden mit UDP */ char *msg = data;
int len = strlen(msg);
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
inet_aton(server_ip, &serv_addr.sin_addr);
if (sendto(sockfd, msg, len, 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("sendto()");
}
[COLOR=seagreen]/* close() - Socket freigeben */ int close(int sockfd);
}
[COLOR=seagreen]/* Parameter: UDP/TCP Client Server-IPv4-Adresse Port */
/* Parameter: UDP/TCP Server Port */int main(int argc, char *argv[]) {
int port, size1=4096, size2=1024;
char *data = (char*)malloc(size1 * sizeof(char));
char *server_ip = (char*)malloc(size2 * sizeof(char));
if (data==NULL || server_ip==NULL) {
printf("Memory allocation failed!\n");
return -1;
}
if ((strcmp(argv[1], "TCP")==0) && (strcmp(argv[2], "Server")==0)) {
if (argc!=4) {
printf("Parameters missing or too many parameters!\n");
return -1;
} else {
port = atoi(argv[3]);
tcp_server(port);
}
} else if ((strcmp(argv[1], "TCP")==0) && (strcmp(argv[2], "Client")==0)) {
if (argc!=5) {
printf("Parameters missing or too many parameters!\n");
return -1;
} else {
server_ip = argv[3];
port = atoi(argv[4]);
printf("Please enter message: ");
fgets(data, size1, stdin);
tcp_client(data, port, server_ip);
free(data);
free(server_ip);
}
} else if ((strcmp(argv[1], "UDP")==0) && (strcmp(argv[2], "Server")==0)) {
if (argc!=4) {
printf("Parameters missing or too many parameters!\n");
return -1;
} else {
port = atoi(argv[3]);
udp_server(port);
}
} else if ((strcmp(argv[1], "UDP")==0) && (strcmp(argv[2], "Client")==0)) {
if (argc!=5) {
printf("Parameters missing or too many parameters!\n");
return -1;
} else {
server_ip = argv[3];
port = atoi(argv[4]);
printf("Please enter message: ");
fgets(data, size1, stdin);
udp_client(data, port, server_ip);
free(data);
free(server_ip);
}
}
return 0;
}