一, UDP是不可靠传输的
udp 要实现可靠传输 就要在上层应用层实现, TCP的滑动窗口的机制
在服务器端 发送数据 会启动一个计时器 , 计时是否超出时间 , 超出就从新发送数据 这里有一个 延时 的情况是 怎么发生呢 是客户端接收到数据又从新把计时器置为0 这种情况会延时
二, udp中’握手’
在udp中要想找到服务器是否启动 或者 发送次数很多的时候可以 调用 connect 就是只连接一次服务器 ,
使用connect连接上服务器 , 类似tcp三次握手
不使用connect
#include "utils/network.h"
int main(int argc, char *argv[])
{
int sockfd, n;
struct sockaddr_in servaddr;
char sendline[MAXLINE], recvline[MAXLINE + 1];
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, SERV_IP, &servaddr.sin_addr.s_addr);
//创建socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
err_sys("socket error");
return -1;
}
while (Fgets(sendline, MAXLINE, stdin) > 0)
{
Sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
if (Readable_timeo(sockfd, 5) == 0) {
fprintf(stderr, "socket timeout\n");
continue;
}
n = Recvfrom(sockfd, recvline, MAXLINE, 0, 0, 0);
recvline[n] = 0; /* null terminate */
Fputs(recvline, stdout);
}
return 0;
}
使用connect连接
#include "utils/network.h"
int main(int argc, char *argv[])
{
int sockfd, n;
struct sockaddr_in servaddr;
char sendline[MAXLINE], recvline[MAXLINE + 1];
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, SERV_IP, &servaddr.sin_addr.s_addr);
//创建socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
err_sys("socket error");
return -1;
}
Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while (Fgets(sendline, MAXLINE, stdin) > 0)
{
Sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
if (Readable_timeo(sockfd, 5) == 0) {
fprintf(stderr, "socket timeout\n");
continue;
}
n = Recvfrom(sockfd, recvline, MAXLINE, 0, 0, 0);
recvline[n] = 0; /* null terminate */
Fputs(recvline, stdout);
}
return 0;
}