基于 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;
}