UDP socket 编程示例

本代码根据老师提供的tcp示例改写

一、UDP socket 编程模型

    

二、使用UDP协议实现一个简单的通讯程序

1.服务器端

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



void print_usage(char * cmd)
{
	fprintf(stderr," %s usage:\n",cmd);
	fprintf(stderr,"%s  [port]\n",cmd);

}

int main(int argc,char** argv)
{
	struct sockaddr_in server;
	struct sockaddr_in client;
	int sockfd;
	int len;
	int port;
	int sendnum;
	int recvnum;
	int opt;
	char send_buf[2048];
	char recv_buf[2048];
	int addr_len = sizeof(struct sockaddr_in);
	if ((1>argc)|| (argc >2))
	{
		print_usage(argv[0]);
		exit(1);

	}
	if (2==argc) 
	{
		port = atoi(argv[1]);
	}
	memset(send_buf,0,2048);
	memset(recv_buf,0,2048);
	opt=SO_REUSEADDR;
	if (-1==(sockfd=socket(AF_INET,SOCK_DGRAM,0)))
	{
		perror("create socket error\n");
		exit(1);
	}
	memset(&server,0,sizeof(struct sockaddr_in));
	server.sin_family = AF_INET;
   	server.sin_addr.s_addr = htonl(INADDR_ANY);
	server.sin_port = htons(port);
	if (-1==bind(sockfd,(struct sockaddr *)&server,sizeof(struct sockaddr)))
	{
		perror("bind error\n");
		exit(1);
	}
	while (1)
	{

        	if (0>(recvnum = recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&client,&addr_len)))
		{
			perror("recv error\n");
			//close(sockfd);
			continue;
		}
		recv_buf[recvnum]='\0';

		printf ("the message from the client is: %s\n",recv_buf);
	
		if (0==strcmp(recv_buf,"quit"))
        	{
			perror("the client break the server process\n");
			close(sockfd);
			break;
		}

		sendnum = sprintf(send_buf,"The message from client is %s\n",recv_buf);
  		sendto(sockfd,send_buf,sizeof(send_buf),0,(struct sockaddr *)&client,sizeof(client));
		continue;

	}
	close(sockfd);
	return 0;
}

2.客户端

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

#define PORT 8900


void print_usage(char * cmd)
{
	fprintf(stderr," %s usage:\n",cmd);
	fprintf(stderr,"%s IP_Addr [port]\n",cmd);

}


int main(int argc,char** argv)
{
	struct sockaddr_in server;
	int ret;
	int len;
	int port;
	int sockfd;
	int sendnum;
	int recvnum;
	char send_buf[2048];
	char recv_buf[2048];
	int addr_len = sizeof(struct sockaddr_in);
	if ((2>argc)|| (argc >3))
	{
		print_usage(argv[0]);
		exit(1);

	}
	if (3==argc) 
	{
		port = atoi(argv[2]);
	}
	if (-1==(sockfd=socket(AF_INET,SOCK_DGRAM,0)))
	{
		perror("can not create socket\n");
		exit(1);
	}

	memset(&server,0,sizeof(struct sockaddr_in));
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = inet_addr(argv[1]);
	server.sin_port = htons(port);

	if (0>(ret=connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr))))
	{
		perror("connect error");
		close(sockfd);
		exit(1);

	}

	//memset(send_buf,0,2048);
	//memset(recv_buf,0,2048);
	while(1)
	{
		printf("what words do  you want to tell to server:\n");
		//gets(send_buf);
		fgets(send_buf,2048,stdin);
		//sprintf(send_buf,"i am lg,thank for your servering\n");
		if (0>(len=sendto(sockfd,send_buf,sizeof(send_buf),0,(struct sockaddr *)&server,sizeof(server))))
		{
			perror("send data error\n");
			close(sockfd);
			exit(1);
		}
		if (0>(len=recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&server,&addr_len)))
		{
			perror("recv data error\n");
			close(sockfd);
			exit(1);
		}
		recv_buf[len]='\0';
		printf("the message from the server is:%s\n",recv_buf);		
	}
	close(sockfd);
}

三、运行结果

    

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值