说明
在系统编程中,通信的方式有消息队列,共享内存,信号量,管道,信号。但是他们的特点都是只能在同一台主机上通信,不能跨平台。而TCP和UDP通信可以实现不同电脑的通信,在局域网内通信时不需要服务器,但是想要通过网络与不在局域网内的通信那就需要云服务器了。
TCP-服务器
1、建立套接字
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
函数作用
建立套接字,返回套接字文件描述符
函数参数
domain : 你要选择 哪一种 地址族
PF_INET / AF_INET Ipv4 网络协议
PF_INET6/AF_INET6 Ipv6 网络协议
type: 你 要选择 哪一种 协议
SOCK_STREAM 选择TCP ----流式 套接字
SOCK_DGRAM 选择UDP ----数据报套接字
protocol : 传0表示使用默认协议
返回值
成功返回 套接字文件描述符 sockfd
失败返回 -1
2、绑定自己的IP
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:
进程绑定自己的IP地址 和 端口号
参数
sockfd : 套接字文件描述符
addr : 自己的IP地址和端口号
addrlen : 地址的大小长度(地址族 端口号 IP地址 共8字节)
struct sockaddr ---旧的结构体
{
unsigned short int sa_family; ---IP地址 端口号 、 协议
unsigned char sa_data[14];
};
IPV4结构体--新结构体(新结构体中少了8个字节,实际使用过程,需要填充满16字体)
struct sockaddr_in
{
sa_family_t sin_family; /地址族 IPV4 IPV6/
unsigned short sin_port; /端口号/
struct in_addr sin_addr; /IP地址/
};
struct in_addr {
in_addr_t s_addr; /in_addr_t为 32位的unsigned int,该无符号整数采用大端字节序。/
};
比如:初始化 IP地址 和端口号 --IPV4
struct sockaddr_in serverAddr;
serverAddr.sin_family = PF_INET ; //AF_INET
serverAddr.sin_port = htons (50000) ; // host to network short 服务器进程端口号
serverAddr.sin_addr.s_addr = inet_addr("192.168.1.120"); //服务器IP地址
connect(sockfd, (struct sockaddr * )&serverAddr, sizeof(struct sockaddr_in) );
3、监听
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
作用
创建一个未连接队列 ,同时最多连接的客户端总数 backlog
参数
sockfd : 套接字文件描述符
backlog :同时最多支持连接上来的客户端总数
返回值
成功返回 0
失败返回 -1
4、等待客户端连接
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
作用
等待客户端的连接
参数
sockfd: 套接字文件描述符
addr : 连接上来的客户端的IP地址和端口号
addrlen : 长度
//如果客户端连接上来了,可以获取到连接上来的客户端的IP地址和端口号
返回值:
成功返回 已连接的套接字文件描述符(使用这个套接进行通信)
失败:-1
5、接收数据
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数
sockfd: 已连接的套接字文件描述符 connectfd
buf : 接收到的数据存储到这里
len : 接收数据的大小
flags : 一般设置为 0
返回值:
成功返回 接收到的字节数
失败返回 -1
返回 0 表示客户端断开连接
6、发送数据
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
作用
用于网络中发送数据
参数
sockfd: 套接字文件描述符
buf : 你要发送的数据
len : 你要发送数据的大小 ,以 字节为单位
flags : 一般默认为 0
返回值
成功返回发送的字节数
失败返回 -1
TCP客户端
客户端和服务器之间的区别:
2、发起连接
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函数参数
sockfd --> 套接字文件描述符
addr ---对方的IP地址 和 端口号(进程端口)
addrlen ---地址的长度 sizeof(struct sockaddr_in )
返回值
成功:0
失败:-1