? ? if(recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr *)&fsin,&alen)<0)
? ? ? ? ? ? errexit("recvfrom: %s\n",strerror(errno));
? ? ? ? (void)time(&now);
? ? ? ? now=htonl((unsigned long)(now+UNIXEPOCH));
? ? ? ? (void)sendto(sock,(char*)&now,sizeof(now),0,(struct sockaddr *)&fsin,sizeof(fsin));
? ? }
}
int errexit(const char *format,...){
? ? va_list arg;
? ? va_start(arg, format);
? ? vfprintf(stderr,format,arg);
? ? va_end(arg);
? ? exit(1);
}
int passivesock(const char *service, const char *transport, int qlen)
/*
?* Arguments:
?*? ? ? service? - service associated with the desired port
?*? ? ? transport - transport protocol to use ("tcp" or "udp")
?*? ? ? qlen? ? ? - maximum server request queue length
?*/
{
? ? struct servent*pse;/* pointer to service information entry*/
? ? struct protoent *ppe;/* pointer to protocol information entry*/
? ? struct sockaddr_in sin;/* an Internet endpoint address*/
? ? int s, type;/* socket descriptor and socket type*/
? ? memset(&sin, 0, sizeof(sin));
? ? sin.sin_family = AF_INET;
? ? sin.sin_addr.s_addr = INADDR_ANY;
? ? ? ? /* Map service name to port number */
? ? if ( pse = getservbyname(service, transport) )
? ? sin.sin_port = htons(ntohs((unsigned short)pse->s_port)+ portbase);
? ? else
? ? ? ? ? ? ? if ((sin.sin_port=htons((unsigned short)atoi(service)+portbase)) == 0)
? ? errexit("can't create passive service %d \n",sin.sin_port);
? ? ? ? /* Map protocol name to protocol number */
? ? if ( (ppe = getprotobyname(transport)) == 0)
? ? errexit("can't get \"%s\" protocol entry\n", transport);
? ? ? ? /* Use protocol to choose a socket type */
? ? if (strcmp(transport, "udp") == 0)
? ? type = SOCK_DGRAM;
? ? else
? ? type = SOCK_STREAM;
? ? ? ? /* Allocate a socket */
? ? s = socket(PF_INET, type, ppe->p_proto);
? ? if (s < 0)
? ? errexit("can't create socket: %s\n", strerror(errno));
? ? ? ? /* Bind the socket */
? ? if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
? ? errexit("can't bind to %s port: %s\n", service,
? ? strerror(errno));
? ? if (type == SOCK_STREAM && listen(s, qlen) < 0)
? ? errexit("can't listen on %s port: %s\n", service,
? ? strerror(errno));
? ? return s;
}
int passiveUDP(const char *service){
? ? return passivesock(service,"udp",0);
}
这里是用的我实验时的代码,前两个是关于echo服务的客户端与服务器端,有下面运行截图:

后两个是关于time服务的,有下面运行截图:

实验时由于多次运行验证,总会出现端口占用的情况,于是这里每次运行时都输入程序的入口参数(就是main函数里的形参),自选端口,方便至极。还有就是代码里多个函数可以写入多个cpp里,这里偷懒了。