套接字实现 TCP 通信流程
/*********************************************************
Copyright © 2022 Shengkai Liu. All rights reserved.
FileName: client.c
Author: Shengkai Liu
Date: 2022-05-30
***********************************************************/
#include <sys/socket.h> // socket, connect
#include <netinet/in.h> // sockaddr_in, htons
#include <arpa/inet.h> // inet_pton
#include <unistd.h> // close
#define SERVER_IP "127.0.0.1"
#define PORT 12345
int main()
{
// Create a client-side socket.
int client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
// Create and initialize address information, including ip and port.
struct sockaddr_in addr;
addr.sin_family = AF_INET;
inet_pton(AF_INET, SERVER_IP, &addr.sin_addr.s_addr);
addr.sin_port = htons(PORT);
// Connect to the server.
connect(client_sockfd, (struct sockaddr*) &addr, sizeof(addr));
// communication
/*..............*/
// close socket
close(client_sockfd);
return 0;
}
/*********************************************************
Copyright © 2022 Shengkai Liu. All rights reserved.
FileName: server.c
Author: Shengkai Liu
Date: 2022-05-30
***********************************************************/
#include <sys/socket.h> // socket, bind, listen, socklen_t, accept
#include <netinet/in.h> // sockaddr_in, htons
#include <arpa/inet.h> // inet_pton
#include <unistd.h> // read, write, close
#define SERVER_IP "127.0.0.1"
#define PORT 12345
int main()
{
// Create a socket for listening.
int listen_sockfd = socket(AF_INET, SOCK_STREAM, 0);
// Create and initialize address information, including ip and port.
struct sockaddr_in listen_addr;
listen_addr.sin_family = AF_INET;
inet_pton(AF_INET, SERVER_IP, &listen_addr.sin_addr.s_addr);
listen_addr.sin_port = htons(PORT);
// Bind listening sockets to addresses.
bind(listen_sockfd, (struct sockaddr*) &listen_addr, sizeof(listen_addr));
// Listening
listen(listen_sockfd, 5);
// Accepting client connections, accept is a blocking function.
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
int server_sockfd = accept(listen_sockfd, (struct sockaddr *)&client_addr, &len);
// Communication
/*.............*/
close(server_sockfd);
close(listen_sockfd);
return 0;
}