UDP server/client实例

本文详细介绍了如何实现一个简单的UDP服务器和客户端。通过实例代码,展示了UDP协议的使用,包括服务器端的监听和接收数据,以及客户端的发送和接收操作。内容涵盖UDP套接字的创建、数据包的封装与解封装等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#define SIZE 300

int main(int argc,char *argv[])
{
	int server_sock,r;
	struct sockaddr_in server_addr,client_addr;
	socklen_t len;
	char buf[SIZE];
	if(argc!=2)
	{
		printf("need port\n");
		return 1;
	}
	server_sock = socket(AF_INET,SOCK_DGRAM,0);
	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(atoi(argv[1]));
	if(-1 == bind(server_sock, (struct sockaddr*)&server_addr,sizeof(server_addr)))
	{
		printf(" bind error\n");
		return -1;
	}
	
 // printf("new client ip:%s, port:%d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));	
	while(1)
	{
	    memset(buf,0,sizeof(buf));
	    r = recvfrom(server_sock,buf,sizeof(buf),0,(struct sockaddr*)&client_addr,&len);
		if(r <0)
		{
		    printf("recv error\n");
		 	return 3;
		}	   
		buf[r]='\0';
		printf("recvfrom client ip:%s, port:%d  len=%d, %s\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),r,buf);
		r = sendto(server_sock,buf,r,0,(struct sockaddr*)&client_addr,len);
		if(r != strlen(buf))
		{
		    printf("sendto error\n");
		 	return 3;
		}
		printf("write len=%d\n",r);       
	}
	close(server_sock);
	
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>

#define SIZE 300

int main(int argc,char *argv[])
{
	char buf[SIZE];
	if(argc!=3)
	{
		printf("ip + port\n");
		return 1;
	}
	int sock,r;
	struct sockaddr_in addr;
	memset(&addr,0,sizeof(addr));
	socklen_t len;
	sock=socket(AF_INET,SOCK_DGRAM,0);
	
	addr.sin_family=AF_INET;
	addr.sin_addr.s_addr=inet_addr(argv[1]);
	addr.sin_port=htons(atoi(argv[2]));
	
	len=sizeof addr;

	
	//printf("new client ip:%s, port:%d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));	
	while(1)
	{
	    memset(buf,0,sizeof(buf));
		printf("input:");
		scanf("%s",buf);
		
		r = sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&addr,len);
		if(r != strlen(buf))
		{
		    printf("sendto error\n");
		 	return 3;
		}
		printf("write len=%d\n",r);  
		
	    r = recvfrom(sock,buf,sizeof(buf),0,NULL,NULL);
		if(r <0)
		{
		    printf("recv error\n");
		 	return 3;
		}	   
		buf[r]='\0';
		printf("recvfrom len=%d,%s\n",r,buf);
		     
	}
	close(sock);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值