#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <strings.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
#include <time.h>
int main(int argc,char *argv[])
{
int sockfd,ret;
struct sockaddr_in serveraddr,clientaddr;
time_t timep;
char recvbuf[1024],buf[120];
sockfd=socket(AF_INET,SOCK_DGRAM,0);
socklen_t client_len;
if(sockfd<0)
{
perror("socket error");
return -1;
}
bzero((struct sockaddr*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr=htons(INADDR_ANY);
serveraddr.sin_port=htons(8888);
ret=bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr));
if(ret<0)
{
perror("bind error");
return -1;
}
while(1)
{
printf("recvfrom ready\n ");
ret=recvfrom(sockfd,recvbuf,1024,0,(struct sockaddr*)&clientaddr,&client_len);
if(ret<0)
{
perror("recvfrom error \n");
close(sockfd);
return -1;
}
printf("recvfrom ok\n");
printf("recvfrom:%s\n",recvbuf);
//timep=time(NULL);
// snprintf(buf,sizeof(buf),"%s",ctime(&timep));
sendto(sockfd,recvbuf,strlen(recvbuf),0,(struct sockaddr*)&clientaddr,sizeof(clientaddr));
bzero((struct sockaddr*)&clientaddr,client_len);
bzero(buf,120);
bzero(recvbuf,1024);
}
close(sockfd);
return 0;
}
客户端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
int main()
{
/*1 创建socket*/
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr;
socklen_t len ;
char buff[512];
if(socket_fd == -1)
{
perror("udp_socket创建失败!退出客户端系统");
exit(-1);
}
/*2 准备地址:需要设计一个地址结构体用于存储sock地址结构 addr 的数据*/
//设置family地址格式类型
addr.sin_family = AF_INET;
/*绑定地址和端口;
* htons是一个转换函数,因为操作系统中的字节排序和网络中字节排序中的字节流顺序是不统一的,所以在进行由系统转化为网络传送。
* htons->host to net short 由主机转换为网络顺序。
*/
addr.sin_port = htons(8888);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (addr.sin_addr.s_addr == INADDR_NONE)
{
printf("Incorrect ip address!");
close(socket_fd);
exit(1);
}
/*3 进行通信*/
len = sizeof(addr);
while (1)
{
fgets(buff,512,stdin);
int n;
//addr是sockaddr_in类型需要进行强制类型转换
n = sendto(socket_fd, buff, strlen(buff), 0, (struct sockaddr *)&addr, sizeof(addr));
if (n < 0)//发送了n个字节
{
perror("sendto");
close(socket_fd);
break;
}
memset(buff,0,sizeof (buff));
n = recvfrom(socket_fd, buff, 512, 0, (struct sockaddr *)&addr, &len);
if (n>0)
{
buff[n] = 0;
printf("received:");
puts(buff);
}
else if (n == -1)
{
perror("recvfrom");
close(socket_fd);
break;
}
}
return 0;
}