[socket] 刘傲天带你C++写socket之客户端发起连接 - 百年刘傲天

in Ubuntusocket with 0 comment

客户端发起连接

在之前的文章中我们创建了服务器,并且接受TCP连接,但是当时我们是使用telnet工具去连接我们的服务端那么这一小节我们就学习怎么去写一个TCP客户端和服务端去通信

函数原型

int connect(int sockfd, const struct sockaddr *serv_addr, socklent_t addrlen);

sockfd 参数由socket系统调用返回一个socket
serv_addr 服务器监听的socket地址
addrlen serv_addr的长度

返回值

连接成功返回0,失败返回-1并设置errno

常见错误

ECONNREFUSED 目标端口不存在,连接被拒绝
ETIMEDOUT 连接超时

关闭连接

函数原型

#include <unistd.h>
int close(int fd);

fd是需要关闭socket的sockfd,close系统调用并非立即关闭一个连接,而是将sockfd的引用计数减一,只有当sockfd的引用计数为0时,才真正关闭连接。

必须关闭连接

函数原型

#include <sys/socket.h>
int shutdown(int sockfd, int howto);

sockfd是需要被关闭的socket
howto参数决定了shutdown的行为
它的取值范围如下

  1. SHUT_RD 关闭sockfd读,应用程序不能从sock文件描述符中进行读取操作,并且将socket接收缓冲区中的数据都被丢弃
  2. SHUT_WR 关闭sockfd上写的这一半,sockfd的发送缓冲区的数据会在真正关闭连接之前全部发送出去,不能在进行写的操作
  3. SHUT_RDWR 同时关闭sockfd的读和写

返回值

shutdown 成功时返回0 失败返回-1并设置errno

Responses