网络编程:
网络编程需要使用通信地址 sockaddr_in ,其中的端口和IP都要做转换,端口要从本机格式转网络格式,IP要从点分十进制转十六进制。函数:
htons() - 本机 转 网络(端口)
inet_addr() - 点分十进制 转 十六进制 (IP)
TCP网络编程步骤:
一对多(也实现一对一):
服务器端:
1.创建socket描述符 socket()
2.准备通信地址,用sockaddr_in
3.绑定bind(),开放权限
4.监听客户端的连接listen()
5.等待客户端的连接accept(),返回一个新的socket描述符,用于与客户端的交互
6.read() write() 读写数据
7.close()
客户端的代码步骤不变
listen(int sockfd,int backlog)
参数 sockfd 就是第一步的返回值
backlog就是当正在处理客户端连接时,有新的客户端连接,会把新的请求放入队列,backlog就是 这个队列的最大长度。而如果处理完毕,从队列中拿出新的请求,队列就会变短
int accept(int sockfd,struct sockaddr* addr,socklen_t* len)
参数 sockfd 就是第一步的返回值
addr 用于存储 客户端的IP
len 是传入传出参数,传入addr的大小,传出真实的大小
注:使用TCP编程时,socket()中的type必须用:SOCK_STREAM
accpet()函数会阻塞,直到有客户端连接才能解除。
信息交互时,服务器和客户端一定要保持读写的一致性。一个读,另外一个必须写。
用 ping IP地址 可以查看网络是否畅通
int reuseaddr =1;//避免重启时 地址被占用 错误
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&reuseaddr,s izeof(reuseaddr));
memset(buf,0,sizeof(buf));//字符串清0
TCP和UDP
TCP是 有连接协议(基于连接的协议),想要数据交互必须保持连接,会给服务器带来很大的压力。好处就是 可以重发一切错误数据,因此TCP的数据一定是正确和完整的。
UDP是 无连接协议,平时不保持任何的连接,服务器压力较小。缺点就是不会主动重发错误数据,因此有可能丢失数据。UDP也可以用connect()进行连接。
UDP编程:(socket(SOCK_DGRAM)就是UDP)
编程步骤:
1 创建socket(),type必须 SOCK_DGRAM
2 准备通信地址
3 如果Server,绑定bind,客户端什么都不用做。
4 使用 sendto()和recvfrom() 交互数据。
5 关闭socket。 close()
注:如果不想 拿发送方的通信地址,read()也可以接收。
int sendto(int sockfd,void* buf,size_t len,int flags,struct sockaddr* addr,socklen_t size)
前3个参数与write()一样,flags置0,后两个参数存储接收方的通信地址和地址长度。
成功返回 发送的字节数,失败 返回 -1.
ssize_t recvfrom(int sockfd,void* buf,size_t len,int flags,struct sockaddr* addr,socklen_t* size)
前3个参数与read()一样,flags置0,后两个参数存发送方的通信地址和地址长度指针。
size 是 一个传入传出参数。
返回实际接收到的字节数,失败 -1.
作业:
用UDP实现一个时间服务器。时间服务器就是取自己的系统时间,返回给客户端。
客户端先发请求(比如hello),服务器端返回当前系统时间,客户端再显示(年月日小时分秒格式)。
注:服务器端 要是一个 死循环,用信号退出
转换日期格式用:
秒差 time_t 函数time()获取
年月日小时分秒格式的时间 - struct tm
转换函数 - localtime()
网络编程需要使用通信地址 sockaddr_in ,其中的端口和IP都要做转换,端口要从本机格式转网络格式,IP要从点分十进制转十六进制。函数:
htons() - 本机 转 网络(端口)
inet_addr() - 点分十进制 转 十六进制 (IP)
TCP网络编程步骤:
一对多(也实现一对一):
服务器端:
1.创建socket描述符 socket()
2.准备通信地址,用sockaddr_in
3.绑定bind(),开放权限
4.监听客户端的连接listen()
5.等待客户端的连接accept(),返回一个新的socket描述符,用于与客户端的交互
6.read() write() 读写数据
7.close()
客户端的代码步骤不变
listen(int sockfd,int backlog)
参数 sockfd 就是第一步的返回值
backlog就是当正在处理客户端连接时,有新的客户端连接,会把新的请求放入队列,backlog就是 这个队列的最大长度。而如果处理完毕,从队列中拿出新的请求,队列就会变短
int accept(int sockfd,struct sockaddr* addr,socklen_t* len)
参数 sockfd 就是第一步的返回值
addr 用于存储 客户端的IP
len 是传入传出参数,传入addr的大小,传出真实的大小
注:使用TCP编程时,socket()中的type必须用:SOCK_STREAM
accpet()函数会阻塞,直到有客户端连接才能解除。
信息交互时,服务器和客户端一定要保持读写的一致性。一个读,另外一个必须写。
用 ping IP地址 可以查看网络是否畅通
int reuseaddr =1;//避免重启时 地址被占用 错误
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&reuseaddr,s izeof(reuseaddr));
memset(buf,0,sizeof(buf));//字符串清0
TCP和UDP
TCP是 有连接协议(基于连接的协议),想要数据交互必须保持连接,会给服务器带来很大的压力。好处就是 可以重发一切错误数据,因此TCP的数据一定是正确和完整的。
UDP是 无连接协议,平时不保持任何的连接,服务器压力较小。缺点就是不会主动重发错误数据,因此有可能丢失数据。UDP也可以用connect()进行连接。
UDP编程:(socket(SOCK_DGRAM)就是UDP)
编程步骤:
1 创建socket(),type必须 SOCK_DGRAM
2 准备通信地址
3 如果Server,绑定bind,客户端什么都不用做。
4 使用 sendto()和recvfrom() 交互数据。
5 关闭socket。 close()
注:如果不想 拿发送方的通信地址,read()也可以接收。
int sendto(int sockfd,void* buf,size_t len,int flags,struct sockaddr* addr,socklen_t size)
前3个参数与write()一样,flags置0,后两个参数存储接收方的通信地址和地址长度。
成功返回 发送的字节数,失败 返回 -1.
ssize_t recvfrom(int sockfd,void* buf,size_t len,int flags,struct sockaddr* addr,socklen_t* size)
前3个参数与read()一样,flags置0,后两个参数存发送方的通信地址和地址长度指针。
size 是 一个传入传出参数。
返回实际接收到的字节数,失败 -1.
作业:
用UDP实现一个时间服务器。时间服务器就是取自己的系统时间,返回给客户端。
客户端先发请求(比如hello),服务器端返回当前系统时间,客户端再显示(年月日小时分秒格式)。
注:服务器端 要是一个 死循环,用信号退出
转换日期格式用:
秒差 time_t 函数time()获取
年月日小时分秒格式的时间 - struct tm
转换函数 - localtime()