C, tcp socket

Материал из sysadm
Перейти к навигации Перейти к поиску

srv.c (Linux)

// srv.c (Linux)
// gcc srv.c -o srv
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>

int main()
{
   struct in_addr local_ip;
   inet_pton(AF_INET, "0.0.0.0", &local_ip);
   unsigned short local_port = 8888;
   
   struct sockaddr_in local_addr_in;
   memset(&local_addr_in, 0, sizeof(struct sockaddr_in));
   local_addr_in.sin_addr = local_ip;
   local_addr_in.sin_port = htons(local_port);
   local_addr_in.sin_family = AF_INET;

   struct sockaddr * local_addr = (struct sockaddr *) &local_addr_in;
   int local_addrlen = sizeof(struct sockaddr);
   
   struct sockaddr remote_addr;
   int remote_addrlen = sizeof(struct sockaddr);
   
   int connector = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   
   int opt_val = 1;
   setsockopt(connector, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof(opt_val));
   
   bind(connector, local_addr, local_addrlen);
   listen(connector, SOMAXCONN);
   int tcp_socket = accept(connector, &remote_addr, &remote_addrlen);
   
   if(tcp_socket > 0)
   {
      printf("Connection established\n");
      char msg[3000];
      
      sleep(2);  // задержка, чтобы дошли все пакеты от клиента

      int recv_bytes = recv(tcp_socket, msg, 3000, 0);
      printf("recv_bytes: %d\n", recv_bytes);
   }
   else
      printf("Error code: %d\n", errno);
   
   close(tcp_socket);
   close(connector);
   return 0;
}

cli.c (Linux)

// cli.c (Linux)
// gcc cli.c -o cli
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

int main()
{
   struct in_addr remote_ip;
   remote_ip.s_addr = inet_addr("127.0.0.1");     // можно так
// inet_pton(AF_INET, "127.0.0.1", &remote_ip);   // или так
   unsigned short remote_port = 8888;
   
   struct sockaddr_in remote_addr_in;
   memset(&remote_addr_in, 0, sizeof(struct sockaddr_in));
   remote_addr_in.sin_addr = remote_ip;
   remote_addr_in.sin_port = htons(remote_port);
   remote_addr_in.sin_family = AF_INET;

   struct sockaddr * remote_addr = (struct sockaddr *) &remote_addr_in;
   int remote_addrlen = sizeof(struct sockaddr);
   
   int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   int error = connect(tcp_socket, remote_addr, remote_addrlen);
   if(error == 0)
   {
      printf("Connection established\n");
      char msg[2000];
      memset(msg, '#' , 2000);
      
      int sent_bytes = send(tcp_socket, msg, 2000, 0);
      
      printf("sent_bytes: %d\n", sent_bytes);
   }
   else
      printf("Error Code: %d\n", error);
   
   close(tcp_socket);
   return 0;
}

cli.c (windows) (не проверено)

// cli.c  (windows)
// gcc cli.c -o cli -l ws2_32
#include <stdio.h>
#include <WS2TcpIp.h>
#include <WinSock2.h>
#include <string.h>

int main()
{
   WSADATA wsa_data;
   unsigned short wsa_version = MAKEWORD(2, 2);
   WSAStartup(wsa_version, &wsa_data);
   
   struct in_addr remote_ip;
   inet_pton(AF_INET, "127.0.0.1", &remote_ip);
   unsigned short remote_port = 8888;
   
   struct sockaddr_in remote_addr_in;
   memset(&remote_addr_in, 0, sizeof(struct sockaddr_in));
   remote_addr_in.sin_addr = remote_ip;
   remote_addr_in.sin_port = htons(remote_port);
   remote_addr_in.sin_family = AF_INET;

   struct sockaddr * remote_addr = (struct sockaddr *) &remote_addr_in;
   int remote_addrlen = sizeof(struct sockaddr);
   
   int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   int error = connect(tcp_socket, remote_addr, remote_addrlen);
   if(error == 0)
   {
      printf("Connection established\n");
      char msg[2000];
      memset(msg, '#' , 2000);
      
      int sent_bytes = send(tcp_socket, msg, 2000, 0);
      
      printf("sent_bytes: %d\n", sent_bytes);
   }
   else
      printf("Error Code: %d\n", WSAGetLastError());
   
   closesocket(tcp_socket);
   WSACleanup();
   return 0;
}