标签:memset 传输 bin ESS 网络编程 网络 自动 byte char
前面介绍了基于TCP实现的服务器端和客户端,本节介绍基于UDP实现的服务器端和客户端。UDP协议提供的无连接的,不可靠的传输服务,在一些要求传输速度,可以接受丢包的传输场景应用广泛,比如视频音频传输场景。UDP中只有创建套接字的过程和数据交换的过程。
#include <sys/socket.h> sszie_t sendto(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrlen); sock : 用于传输数据的UDP套接字的文件描述符 buff : 保存待传输数据的缓存区地址 nbytes : 待传输的数据长度,以字节为单位 flags : 可选参数项,若没有则传递0 to : 传到哪儿 addrlen : 地址长度
#include <sys/socket.h> sszie_t recvfrom(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen); sock : 用于接收数据的UDP套接字的文件描述符 buff : 保存接收数据的缓存区地址 nbytes : 可接收的最大字节数,以字节为单位 flags : 可选参数项,若没有则传递0 to : 从哪儿接收数据 addrlen : from结构体长度的变量地址值
实现基于UDP的客户端和服务器端,客户端给服务器端传输数据,服务器端接收到数据以后将数据原封不动的传回客户端。
服务器端:
#include <iostream> #include <unistd.h> #include <cstdlib> #include <cstdio> #include <string.h> #include <string> #include <arpa/inet.h> #include <sys/socket.h> using namespace std; const int BUFFER_SIZE = 100; int main() { int server_sock = socket(PF_INET, SOCK_DGRAM, 0); if (server_sock == -1) { cout << "socket() failed" << endl; return 0; } sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(10000); if (bind(server_sock, (sockaddr *)&server_addr, sizeof(server_addr)) == -1) { cout << "bind() failed" << endl; close(server_sock); return 0; } for (int i = 0; i < 5; i++) { sockaddr_in client_addr; socklen_t client_addr_size = sizeof(client_addr); char message[BUFFER_SIZE]; int str_len = recvfrom(server_sock, message, BUFFER_SIZE, 0, (sockaddr *)&client_addr, &client_addr_size); cout << message << endl; sendto(server_sock, message, str_len, 0, (sockaddr*)&client_addr, client_addr_size); } close(server_sock); return 0; }
客户端:
#include <iostream> #include <unistd.h> #include <cstdlib> #include <cstdio> #include <string.h> #include <string> #include <arpa/inet.h> #include <sys/socket.h> using namespace std; const int BUFFER_SIZE = 100; int main() { int client_sock = socket(PF_INET, SOCK_DGRAM, 0); if (client_sock == -1) { cout << "socket failed" << endl; return 0; } sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); server_addr.sin_port = htons(10000); for (int i = 0; i < 5; i++) { cout << "input str : "; char message[BUFFER_SIZE]; cin >> message; sendto(client_sock, message, strlen(message), 0, (sockaddr*)&server_addr, sizeof(server_addr)); sockaddr_in from_addr; socklen_t addr_size = sizeof(from_addr); char recv_message[BUFFER_SIZE]; int strlen = recvfrom(client_sock, recv_message, BUFFER_SIZE, 0, (sockaddr*)&from_addr, &addr_size); recv_message[strlen] = ‘\0‘; cout << recv_message << endl; } close(client_sock); return 0; }
TCP客户端在调用connect函数的时候自动给客户端分配IP地址和端口号,UDP中第一次调用sendto函数时给客户端分配IP地址和端口号。
标签:memset 传输 bin ESS 网络编程 网络 自动 byte char
原文地址:https://www.cnblogs.com/418ks/p/11675305.html