利用8月15所学完成以下任务(UDP):
1.利用套接字实现两台主机全双工通信
socket socket
bind
发端:发一次数据(数据可以随便) 收端: 接收一次数据(目的:接收发送方的IP+Port)
两个任务 两个任务
从终端接 -> 发送 从终端接 -> 发送
从网络接 -> 打印 从网络接 -> 打印
send.c
recv.c
UDP特点:
1.不安全不可靠的传输方式
2.UDP资源开销小,实现机制简单
3.UDP是无连接的
UDP包头:(8个字节)
1.源端口号
2.目的端口号
3.长度
4.校验和
每部分分别占两个字节;下面为今天内容:
TCP编程
客户端编程步骤(发端):
创建套接字(Socket): 与服务器端相同,使用
socket()
函数创建一个套接字。int server_fd = socket(AF_INET, SOCK_STREAM, 0);
连接到服务器(Connect): 使用
connect()
函数尝试连接到服务器,发送三次握手请求struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); connect(server_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
发送数据(Send): 使用 send
()函数
发送数据。接受数据(Recv): 使用 recv
()函数
接收数据。关闭套接字(Close): 完成数据交换后,使用
close()
函数关闭套接字。
服务器端编程步骤:
创建套接字(Socket): 使用
socket()
函数创建一个套接字。int server_fd = socket(AF_INET, SOCK_STREAM, 0);
绑定IP地址和端口(Bind): 使用
bind()
函数将套接字与特定的IP地址和端口绑定。struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); bind(server_fd, (struct sockaddr *)&address, sizeof(address));
监听连接(Listen): 使用
listen()
函数让套接字进入监听状态。listen(server_fd, 3);
接受连接,处理连接请求(Accept): 使用
accept()
函数接受客户端的连接请求。int new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
收/发送数据(Recv/Send): 使用
read()
、write()
或其他函数读取接收数据,使用recv()
、send()
与客户端进行数据交换。关闭套接字(Close): 完成数据交换后,使用
close()
函数关闭套接字。close(new_socket); close(server_fd);
1.相关函数接口:
1.socket
UDP: socket(AF_INET, SOCK_DGRAM, 0);
TCP: socket(AF_INET, SOCK_STREAM, 0);2.listen
int listen(int sockfd, int backlog);
功能:
监听发送三次握手连接的套接字,并放入等到处理队列中
参数:
sockfd:套接字文件描述符
backlog:等待队列的大小(最多存放尚未被处理的三次握手请求的个数)
返回值:
成功返回0
失败返回-1
3.accept
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
处理等待队列中的第一个套接字
参数:
sockfd:套接字文件描述符
addr:存放发送方IP地址的空间首地址
addrlen:存放发送方IP地址的空间大小
返回值:
成功返回一个新的文件描述符
失败返回-14.connect
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
向接收方发起连接请求
参数:
sockfd:套接字文件描述符
addr:接收方的IP地址和端口号
addrlen:接收方的IP地址和端口号的大小
返回值:
成功返回0
失败返回-1
5.send
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
向接收方发送数据
参数:
sockfd:套接字文件描述符
buf:要发送的数据的首地址
len:要发送的数据的长度
flags:标志位
返回值:
成功返回发送字节数
失败返回-1
6.recv
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收发送方发送的数据
参数:
sockfd:套接字文件描述符
buf:接收数据的缓冲区首地址
len:接收数据的缓冲区的大小
flags:标志位
返回值:
成功返回实际接收字节数
失败返回-1
对方关闭返回0
发端:示例代码如下
收端: