C, tcp socket
Перейти к навигации
Перейти к поиску
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; }