网络编程之socket---UDP

UDP传输

         UDP(User Data Protocol,用户数据报协议)是与 TCP 相对应的协议。它是属于 TCP/IP 协议族中的一种
UDP 不提供可靠性,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。Udp 传输过程相较于 TCP 传输过程,少了发起连接以及监听接收连接请求的过程。

函数

socket()


domain(协议族):


type(类型):



protocol(协议): 

通常设置为0,默认

扫描二维码关注公众号,回复: 949862 查看本文章

bind():



recvfrom()


sendto()


字节序转换

uint32_t htonl(uint32_t hostlong); //把32位值从主机字节序转换成网络字节序
uint16_t htons(uint16_t hostshort);//把16位值从主机字节序转换成网络字节序
uint32_t ntohl(uint32_t netlong);  //把32位值从网络字节序转换成主机字节序
uint16_t ntohs(uint16_t netshort); //把32位值从网络字节序转换成主机字节序
in_addr_t inet_addr(const char *cp);//返回网络字节序
in_addr_t inet_network(const char *cp);//返回主机字节序
char *inet_ntoa(struct in_addr in);//网络字节 ——》IP字符串
int inet_aton(const char *cp, struct in_addr *inp);//返回网络字节序 


服务端示例

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


int main(int argc, char *argv[])
{
	int sockfd;
	int ret;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	//创建socket套接字
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if (sockfd < 0){
		perror("socket error");
		return -1;
	}
	//设置服务端信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(9000);
	server_addr.sin_addr.s_addr = inet_addr("192.168.121.128");

	int len = sizeof(struct sockaddr_in);
	//调用bind函数,将套接字与地址信息进行绑定
	ret = bind(sockfd, (struct sockaddr*)&server_addr, len);
	if (ret < 0){
		perror("bind error");
		return -1;
	}
	//服务器端不再需要监听socket,直接从绑定的地址端口上调用recvfrom函数接收数据,
	//并获得客户端的地址信息
	char buff[1024] = {0};
	while (1){
		memset(buff, 0x00, 1024);
		ret = recvfrom(sockfd, buff, 1024, 0, (struct sockaddr*)&client_addr, &len);
		if (ret < 0){
			continue;
		}
		printf("%s--ip:[%s], port:[%d]\n", buff, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
		sleep(1);
	}
	close(sockfd);
	return 0;
}

客户端示例

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>


int main(int argc, char *argv[])
{
	int sockfd;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	//创建套接字
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if (sockfd < 0){
		perror("socket error");
		return -1;
	}
	
	//设置服务端地址信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(9000);
	server_addr.sin_addr.s_addr = inet_addr("192.168.121.128");

	char buff[1024] = {0};
	int i = 0;
	int len = sizeof(struct sockaddr_in);
	while (1){
		memset(buff, 0x00, 1024);
		sprintf(buff, "test--%d", i++);
		//调用sendto函数向指定地址发送数据
		sendto(sockfd, buff, 1024, 0, (struct sockaddr*)&server_addr, len);
		sleep(1);
	}
	close(sockfd);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33408113/article/details/80108693