c++ 网络编程
标签(空格分隔): c++
建立socket
int socket(int domain,int type ,int protocol);
- domain 通常为PF_INET,表示互联网协议(TCP/IP)
- type 指定了Socket的类型 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
- protocol 通常赋值为0
绑定socket
int bind(int scokfd,struct sockaddr *MyAddr,int AddrLen);
- scokfd Socket()函数返回的Socket套接字
- MyAddrr 指向含有本机IP地址及端口号的sockaddr类型的指针
- sockaddr
struct sockaddr{ unsigned short as_family;//地址族,AF_xxx char sa_data[14]; //14字节的协议地址 }
* **sa_family** 一般为*AF_INET*,代表TCP/IP * **sa_data** 包含socket的IP地址和端口号
- sockaddr_in 这个结构更加通用,与socketaddr结构体类似,且他们的指针可以互相替代
struct sockaddr_in{ short int sin_family;//地址族 unsignedshort int sin_port;//端口号 struct in_addr sin_addr;//IP地址 unsigned char sin_zero[8];//填充0,以与 struct sockaddr大小保持一致 }
* **sin_family** 必须设置为*AF_INET* * **sin_port** 端口号 * **sin_addr** 一个unsigned long的IP地址 * **sin)zero** 填充0,用于与sockaddr大小保持一致
注意sin_port和sin_addr需要转换成网络字节优先顺序
建立连接
面向连接的客户端程序可以使用Connect函数来配置Socket,从而与远端服务器建立一个TCP连接,其函数原型为:int connect(int sockfd, stuct sockaddr *serv_addr ,int addrlen);
- sockfd socket()函数返回的socket套接字
- serv_addr 包含远端主机的IP地址和端口号的指针
- addrlen 远端地址结构的长度
- 当连接失败时,返回-1,并且设置错误信息
监听
服务器端程序调用listern()函数使得socket处于一个别动监听的模式,并且为这个socket建立一个输入数据队列,将到达服务器的请求保存到此队列中,直到程序处理。int listen(int sockfd, int backlog);
- sockfd 调用socket()函数返回的socket套接字
- backlog 指定在请求队列中允许的最大请求数
- 缓存队列中的请求,等待accept处理
服务器端接收
建立好缓存队列后,服务器端程序可以调用accept()函数处理客户的连接请求。int accept(int sockfd, void addr, int addrlen);
- sockfd 被监听的socket套接字
- addr 通常是一个指向sockaddr_in变量的指针,该变量用于存储提出连接请求的主机信息
- addrlen 通常是一个指向值为
sizeof(struct sockaddr_in)
的整型指针变量
数据发送和接收
面向连接的数据发送
int send(int sockfd, const void *msg, int len, int flags);
- sockfd 监听的套接字
- msg 指向要发送的数据
- len 以字节为单位的数据长度
- flags 一般设置为0
- 返回值为实际发送出去的字节数
面向连接的数据接收
int recv(int sockfd, void *buf, int len, int flags);
- sockfd 监听的套接字
- buf 存放接收数据的缓冲区
- len 以字节为单位的数据长度
- flags 一般设置为0
- 返回值为实际接收到的数据
无连接的数据发送
int sendto(int sockfd, const void msg, int len, int flags, const struct sockaddr to, int tolen);
这个函数比send()函数多了两个参数
- to 要发送数据到的目的主机的IP地址和端口号信息
- tolen 通常别赋值为
sizeof(struct sockaddr)
- 返回值为实际发送出去的字节数
无连接的数据接收
int recvfrom(int sockfd, void buf, int len, int flag, struct sockaddr from, int fromlen);
这个函数比recv()*函数多了几个参数
- from 是一个struct sockaddr类型的变量,保存数据来源主机的IP地址和端口号
- fromlen 一般设置为
sizeof(stuct sockaddr)
- 返回值为实际接收到的数据
关闭socket
- 停止socket上面的全部操作
close(sockfd);
关闭socket上面的某一个操作
int shutdown(int sockfd, int how);
how有几个可选的值- 0:不允许继续接收数据
- 1:不允许接续发送数据
- 2:不允许继续发送和接收数据