Linux学习笔记15 udp通信

udp通信相比与tcp通信,不再需要三次握手和四次挥手,对应到程序上就不需要服务器去accept和客户端connect

udp通信服务端

#include <sys/types.h> 
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

int main()
{
	int fd=socket(AF_INET, SOCK_DGRAM, 0);
//只需要一个套接字文件描述符就够了,不用像tcp,需要一个负责接收客户端,一个负责和客户端通信
//注意第二个参数和TCP不一样
	if (fd==-1)
	{
		cout<<"socket is error!";
		exit(1);
	}

	struct sockaddr_in ser_addr;
	ser_addr.sin_family=AF_INET;
	ser_addr.sin_port=htons(8888);
	inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr.s_addr);
	bind(fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr));//绑定服务端本地ip和端口

	char buf[256];
	char response[]="message is received";	
	struct sockaddr_in cli_addr;
	socklen_t cli_addr_len=sizeof(cli_addr);
	while (1)
	{
/*不需要再对recvfrom返回值做判断,因为udp没有三次握手和四次挥手的过程,不需要人为判断是否传输结束,然后去结束两者之间的通信,客户端发来信息,客户端就不再和服务端有联系了*/
		int n=recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&cli_addr, &cli_addr_len);
//只能使用recvfrom和sendto函数去收发数据,因为需要在收发数据同时加入对方的IP和端口信息,这里在接收时,会把对方的ip和端口接收到,	
		cout<<buf<<endl;
		sendto(fd, response, strlen(response)+1, 0, (struct sockaddr*)&cli_addr, sizeof(cli_addr));		
//这里在发送时会将收到的ip和端口信息再发出去,指明发送的目标
	}
	close(fd);
	return 0;
}

udp通信客户端

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

using namespace std;

int main()
{
	int fd=socket(AF_INET, SOCK_DGRAM, 0);
	if (fd==-1)
	{
		cout<<"socket is error!";
		exit(1);
	}

	struct sockaddr_in ser_addr;
	ser_addr.sin_family=AF_INET;
	ser_addr.sin_port=htons(8888);
	inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr.s_addr);//绑定服务端的ip和端口号

	char buf[256];	

	while (1)
	{
		fgets(buf, sizeof(buf), stdin);
		sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
//将数据发送到ser_addr指定的ip和端口
		int n=recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
//从主机接收时,因为已经知道主机的端口和IP了,所以后面两个参数可以填NULL。
		cout<<buf<<endl;		
	}
	close(fd);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34489443/article/details/88413557