基于 UDP 通信的代码

功能:使用UDP协议从客户端向服务器发送消息,服务器打印消息并显示发送该消息的客户端IP

//server.c
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
int sockfd=-1;
void return_time(struct sockaddr_in caddr){
	time_t tt;
	tt=time(&tt);
	int c_len=sizeof(caddr);	
	printf("return time=======\n");	
	int ret=sendto(sockfd,ctime(&tt),30,0,(struct sockaddr *)&caddr,c_len);
	if(ret<0){
		perror("sendto");
		exit(-4);
	}

}
int main(){
	sockfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd < 0){
		perror("socket");
		exit(-1);
	}
	//绑定本地IP地址和端口号
	struct sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(8080);
	saddr.sin_addr.s_addr = INADDR_ANY;
	int s_len=sizeof(saddr);
	printf("server started\n");
	int ret = bind(sockfd, (struct sockaddr *)&saddr,s_len);
	if(ret<0){
		perror("bind");
		exit(-2);
	}	
	struct sockaddr_in caddr;
	memset(&caddr,0,sizeof(caddr));
	int c_len=sizeof(caddr);
	char buf[64]={0};
	while(1){
		int ret=recvfrom(sockfd,buf,64,0,(struct sockaddr *)&caddr,&c_len);
		if(ret<0){
			perror("recvform");
			exit(-3);
		}
		if(strncmp(buf,"time",4)==0){
			printf("time========\n");
			return_time(caddr);
		}
	printf("ip : %s -- recv %d bytes : %s",inet_ntoa(caddr.sin_addr),ret,buf);
	}
	return 0;
}

//client.c
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
int sockfd;
void * recv_info(void *arc){
	printf("client start recive\n");
	struct sockaddr_in caddr;
	caddr.sin_family= AF_INET;
	caddr.sin_port=htons(8080);
	caddr.sin_addr.s_addr=INADDR_ANY;
	int c_len=sizeof(caddr);
	char buf[64];
	while(1){
		memset(buf,0,sizeof(buf));
		int ret=recvfrom(sockfd,buf,64,0,(struct sockaddr*)&caddr,&c_len);
		if(ret<0){
			perror("client recvfrom");
			exit(-3);
		}
		printf("time : %s\n",buf);
	}	
}
int main(){
	sockfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd < 0){
		perror("socket");
		exit(-1);
	}
	//绑定本地IP地址和端口号
	struct sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(8080);
	saddr.sin_addr.s_addr = inet_addr("192.168.12.57");
	int s_len=sizeof(saddr);
	pthread_t pt;
	pthread_create(&pt,NULL,recv_info,NULL);
	char buf[64];
	while(1){
		memset(buf,0,sizeof(buf));
		printf("please entrace a comtent to server\n");
		fgets(buf,sizeof(buf),stdin);
		printf("buf = %s\n",buf);
		int ret=sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&saddr,s_len);
		if(ret<0){
			perror("sendto");
			exit(-3);

		}
		printf("send success!\n");
	}
	return 0;

}