C, tcp socket: различия между версиями
Перейти к навигации
Перейти к поиску
Admin (обсуждение | вклад) |
(нет различий)
|
Текущая версия на 20:08, 16 июня 2024
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;
}