2020/03/09 基于UDP的自定义协议 调试笔记

1. UDP的发送、接收函数

 UDP是一个无连接的协议,不需要像TCP协议一样的accept()等建立连接的操作

但UDP也可以使用connect(),用于指定目标地址,用法如下:

connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));

使用UDP协议的基本方法

想要获取发送端地址,采用recv()、recvfrom()函数:从sockfd中获取发送方的地址和消息

recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&clientaddr, &len)

想要指定目标地址,采用sendto()、recvfrom()函数:通过sockfd指定目标地址,并发送消息过去

sendto(sockfd, ptr, size, 0, (struct sockaddr*)&clientaddr, len)

我们自定义的收发函数write_msg、read_msg是基于连接的!!所以用不了啊。。

尝试用connect指定目标地址 ~ 

一开始不太懂connect函数的具体用法,以为它就是建立连接用的

实际上:在UDP中,connect()仅仅用于指定目标地址,所以在服务器中用connect就只能接收某一端口的信息,这样是完全错误的!所以程序出现了异常。在客户端应用connect(),编译通过了,但服务器端读不到消息。

使用connect函数绑定套接字后,发送不能再用sendto函数,只能用write()直接操作套接字文件描述符,不用再指定目的地址和端口;接收不能用recvfrom函数,只能使用read()类函数,函数不会返回发送方的地址和端口号。多次使用connect会改变原有的地址和端口号,可以用这种方法断开原来的连接。

2. 找到获取客户端地址的方法 

没找到。。。。。

3. 这里把序号直接放在消息的尾部,服务端收到后进行解析

发送的是hello,This is client1,然后解析出数据和序号,结果如下:

猜你喜欢

转载自blog.csdn.net/Xinyue_Lu/article/details/104796183