UDP编程
程序员文章站
2022-03-16 11:04:45
...
服务端代码:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#define TIME_PORT 9090
#define DATA_SIZE 256
int main()
{
int sock_fd;
struct sockaddr_in local;
struct sockaddr_in from;
int n;
socklen_t fromlen;
char buff[DATA_SIZE];
time_t cur_time;
sock_fd = socket(AF_INET,SOCK_DGRAM,0);
local.sin_family = AF_INET;
local.sin_port = htons(TIME_PORT); //监听端口
local.sin_addr.s_addr = INADDR_ANY; //本机
memset(local.sin_zero,0,8);
if(0 != bind(sock_fd,(struct sockaddr *)&local,sizeof(local))){
perror("bind socket error!");
close(sock_fd);
return -1;
}
printf("Bind socket\n");
fromlen = sizeof(from);
while(1){
n = recvfrom(sock_fd,buff,sizeof(buff),0,(struct sockaddr *)&from,&fromlen); //接收数据
if(n > 0){
buff[n] = '\0'; //设置字符串结束符
printf("Get Msg From %s : %s\n",inet_ntoa(from.sin_addr),buff); //将32位IP地址转化为a.b.c.d
}
if(0 == strncmp(buff,"quit",4)) //判断是否退出
break;
if(0 == strncmp(buff,"time",4)){ //判断是否请求时间
cur_time = time(NULL); //生成当前时间的字符串
strcpy(buff,asctime(gmtime(&cur_time)));
sendto(sock_fd,buff,sizeof(buff),0,(struct sockaddr *)&from,fromlen); //发送时间给客户端
}
}
close (sock_fd);
return 0;
}
客户端:
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#define TIME_PORT 9090
#define DATA_SIZE 256
int main()
{
int sock_fd;
struct sockaddr_in serv;
int n;
socklen_t servlen;
char buff[DATA_SIZE];
sock_fd = socket(AF_INET,SOCK_DGRAM,0);
serv.sin_family = AF_INET;
serv.sin_port = htons(TIME_PORT);
serv.sin_addr.s_addr = INADDR_ANY;
servlen = sizeof(serv);
strcpy(buff,"time");
if(-1 == sendto(sock_fd,buff,sizeof(buff),0,(struct sockaddr *)&serv,servlen)){ //发送请求
perror("send data");
close(sock_fd);
return 0;
}
printf("send time request\n");
n = recvfrom(sock_fd,buff,sizeof(buff),0,(struct sockaddr *)&serv,&servlen); //接受返回
buff[n] = '\0';
printf("time from server: %s\n",buff);
/*退出连接*/
strcpy(buff,"quit");
if(-1 == sendto(sock_fd,buff,sizeof(buff),0,(struct sockaddr *)&serv,servlen)){
perror("send data");
close(sock_fd);
return 0;
}
printf("send quit command\n");
close(sock_fd);
return 0;
}
下一篇: MapReduce学习笔记
推荐阅读