#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
void error(const char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char const *argv[])
{
if (argc < 2)
{
fprintf(stderr, "Port didd't provided. Program terminated\n");
exit(1);
}
int sockfd, newsockfd, portnumber, temp;
char buffer[255];
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;
sockfd = socket(AF_INET, SOCK_STREAM, 0); // 0 = tcp
if (sockfd < 0)
{
error("Error opening socket");
}
memset(&server_addr, 0, sizeof server_addr);
portnumber = atoi(argv[1]);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(portnumber);
if (bind(sockfd, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0)
{
error("Binding failed");
}
listen(sockfd, 5);
client_len = sizeof(client_addr);
newsockfd = accept(sockfd, (struct sockaddr*) &client_addr, &client_len);
if (newsockfd < 0)
{
error("Error on accept");
}
while (1)
{
memset(buffer, 0, 255);
temp = read(newsockfd, buffer, 255);
if (temp < 0)
{
error("Error on reading");
}
printf("client : %s\n", buffer);
memset(buffer, 0, 255);
std::cin.getline(buffer, 255);
temp = write(newsockfd, buffer, strlen
(buffer));
if (temp < 0)
{
error("Error on writting");
}
if (int i = strncmp("bye", buffer, 3) == 0)
{
break;
}
}
close(newsockfd);
close(sockfd);
return 0;
}
// argv[0] - filename
// argv[1] - server_ipaddres
// argv[2] - portnumber
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> // hostent struct
#include <iostream>
#include <arpa/inet.h>
void error(const char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char const *argv[])
{
int sockfd, portnumber, temp;
struct sockaddr_in server_addr;
char buffer[255];
if (argc < 2)
{
fprintf(stderr, "usage %s hostname port\n", argv[0]);
exit(1);
}
portnumber = atoi(argv[1]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
error("Error opening socket");
}
portnumber = atoi(argv[1]);
server_addr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
server_addr.sin_port = htons(portnumber);
if (connect(sockfd, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0)
{
error("Connection failed");
}
while (1)
{
memset(buffer, 0, 255);
std::cin.getline(buffer, 255);
temp = write(sockfd, buffer, strlen(buffer));
if (temp < 0)
{
error("Error on writting");
}
memset(buffer, 0, 255);
temp = read(sockfd, buffer, 255);
if (temp < 0)
{
error("Error on reading");
}
printf("server : %s\n", buffer);
if (int i = strncmp("bye", buffer, 3) == 0)
{
break;
}
}
close(sockfd);
return 0;
}
Функция getaddrinfo(3) объединяет действия функций getipnodebyname(3), getipnodebyaddr(3), getservbyname(3) и getservbyport(3) в одном интерфейсе. Функция getaddrinfo(3) создает одну или несколько структур адресов сокета, которые в дальнейшем могут быть использованы в вызовах функций bind(3) или connect(3) для создания сокета клиента или сервера.