接上文,本文写客户端的实现,重复的细节就不在赘述。
创建客户端套接字
int client_fd = socket(PF_INET, SOCK_STREAM, 0);
if (client_fd == -1)
{
cerr << "Failed to create socket" << endl;
return -1;
}
ipv4结构体存储 服务端 的信息
sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;// 设置地址族
server_addr.sin_addr.s_addr = inet_addr(argv[1]);//绑定服务端的IP
server_addr.sin_port = htons(argv[2]);//绑定服务端的端口号
连接到服务端 connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
参数1:套接字文件描述符
参数2:包含服务端ip和端口的地址结构体指针
参数3:地址结构体的大小,即参数2指向内存的大小
调用connect()函数连接到服务端时,操作系统会自动为客户端分配一个可用的本地端口,所以我们不需要设置客户端的端口。
if (connect(client_fd, (sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
cerr << "Failed to connect to server" << endl;
close(client_fd);
return -1;
}
发送数据到服务端 send()
string data = "Hello, server!";
ssize_t bytes_sent = send(client_fd, data.c_str(), data.size(), 0);
if (bytes_sent == -1)
{
cerr << "Failed to send data to server" << endl;
close(client_fd);
return -1;
}
关闭套接字
close(client_fd);