- 注:以下代码是在观看网易云课堂,职坐标发布的Linux网络编程|人工智能物联网时,跟着视频写的,仅为学习使用。代码出处在这里:https://study.163.com/course/courseMain.htm?share=1&shareId=1020885091&courseId=1002913013&trace_c_p_k2=f61d55ffe1e84f9d8ec0dd31b371723c
1 客户端发送信息,服务器返回时间
1.1 服务器
#include<sys/socket.h>
#include<netdb.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<signal.h>
#include<time.h>
#include<arpa/inet.h>
int sockfd;
void sig_handler(int signo)
{
if(signo==SIGINT){
printf("server close");
close(sockfd);
exit(1);
}
}
void out_addr(struct sockaddr_in *clientaddr)
{
char ip[16];
memset(ip,0,sizeof(ip));
inet_ntop(AF_INET,&clientaddr->sin_addr.s_addr,ip,sizeof(ip));
int port=ntohs(clientaddr->sin_port);
printf("client: %s(%d)\n",ip,port);
}
void do_service()
{
struct sockaddr_in clientaddr;
socklen_t len=sizeof(clientaddr);
char buffer[1024];
memset(buffer,0,sizeof(buffer));
if(recvfrom(sockfd,buffer,sizeof(buffer),0,
(struct sockaddr*)&clientaddr,&len)<0){
perror("recvfrom error");
}else{
out_addr(&clientaddr);
printf("client send into: %s\n",buffer);
long int t=time(0);
char *ptr=ctime(&t);
size_t size=strlen(ptr)*sizeof(char);
if(sendto(sockfd,ptr,size,0,(struct sockaddr*)&clientaddr,len)<0){
perror("sendto error");
}
}
}
int main(int argc,char* argv[])
{
if(argc<2){
printf("usage: %s port\n",argv[0]);
exit(1);
}
if(signal(SIGINT,sig_handler)==SIG_ERR){
perror("signal sigint error");
exit(1);
}
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0){
perror("socket error");
exit(1);
}
int ret;
int opt=1;
if((ret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,
&opt,sizeof(opt)))<0){
perror("setsockopt error");
exit(1);
}
struct sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[1]));
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
perror("bind error");
exit(1);
}
while(1){
do_service();
}
return 0;
}
1.2 客户端
#include<sys/socket.h>
#include<netdb.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<memory.h>
#include<unistd.h>
#include<arpa/inet.h>
int main(int argc,char *argv[])
{
if(argc<3){
printf("usage: %s ip port\n",argv[0]);
exit(1);
}
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0){
perror("socket error");
exit(1);
}
struct sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&serveraddr.sin_addr.s_addr);
char buffer[1024]="Night00 is testing a UDP program";
if(sendto(sockfd,buffer,sizeof(buffer),0,
(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
perror("sendto error");
exit(1);
}else{
memset(buffer,0,sizeof(buffer));
size_t size;
if((size=recv(sockfd,buffer,sizeof(buffer),0))<0){
perror("recv error");
exit(1);
}else{
printf("%s",buffer);
}
}
close(sockfd);
return 0;
}
2 域名解析
2.1 gethostbyname
#include<netdb.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<arpa/inet.h>
void out_addr(struct hostent *h){
printf("hostname: %s\n",h->h_name);
printf("addrtype: %s\n",h->h_addrtype==AF_INET ? "IPv4":"IPv6");
char ip[16];
memset(ip,0,sizeof(ip));
inet_ntop(h->h_addrtype,h->h_addr_list[0],ip,sizeof(ip));
printf("ip address: %s\n",ip);
int i=0;
while(h->h_aliases[i]!=NULL){
printf("aliase: %s\n",h->h_aliases[i]);
++i;
}
}
int main(int argc,char *argv[])
{
if(argc<2){
printf("usage: %s host\n",argv[0]);
exit(1);
}
struct hostent *h;
h=gethostbyname(argv[1]);
if(h!=NULL){
out_addr(h);
}else{
printf("no %s exists\n",argv[1]);
}
endhostent();
return 0;
}
2.2 gethostent
#include<netdb.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<arpa/inet.h>
void out_addr(struct hostent *h){
printf("hostname: %s\n",h->h_name);
printf("addrtype: %s\n",h->h_addrtype==AF_INET ? "IPv4":"IPv6");
char ip[16];
memset(ip,0,sizeof(ip));
inet_ntop(h->h_addrtype,h->h_addr_list[0],ip,sizeof(ip));
printf("ip address: %s\n",ip);
int i=0;
while(h->h_aliases[i]!=NULL){
printf("aliase: %s\n",h->h_aliases[i]);
++i;
}
}
int main(int argc,char *argv[])
{
if(argc<2){
fprintf(stderr,"usage: %s host\n",argv[0]);
exit(1);
}
struct hostent *h;
while((h=gethostent())!=NULL){
if(!strcmp(argv[1],h->h_name)){
out_addr(h);
exit(0);
}else{
int i=0;
while(h->h_aliases[i]!=NULL){
if(!strcmp(argv[1],h->h_aliases[i])){
out_addr(h);
exit(0);
}
++i;
}
}
}
endhostent();
printf("no %s exist\n",argv[1]);
return 0;
}
3 广播
3.1 接收方
#include<netdb.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<unistd.h>
int sockfd;
void sig_handler(int signo)
{
if(signo==SIGINT){
printf("receiver will exited\n");
close(sockfd);
exit(1);
}
}
int main(int argc,char *argv[])
{
if(argc<2){
fprintf(stderr,"usage: %s port\n",argv[0]);
exit(1);
}
if(signal(SIGINT,sig_handler)==SIG_ERR){
perror("signal sigint error");
exit(1);
}
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0){
perror("socket error");
exit(1);
}
struct sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[1]));
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
perror("bind error");
exit(1);
}
char buffer[1024];
struct sockaddr_in clientaddr;
socklen_t len=sizeof(clientaddr);
while(1){
memset(buffer,0,sizeof(buffer));
memset(&clientaddr,0,sizeof(clientaddr));
if(recvfrom(sockfd,buffer,sizeof(buffer),0,
(struct sockaddr*)&clientaddr,&len)<0){
perror("recvfrom error");
exit(1);
}else{
char ip[16];
inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,
ip,sizeof(ip));
int port=ntohs(clientaddr.sin_port);
printf("%s(%d): %s\n",ip,port,buffer);
}
}
return 0;
}
3.2 发送方
#include<netdb.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
if(argc<3){
fprintf(stderr,"usage: %s ip port\n",argv[0]);
exit(1);
}
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0){
perror("perror error");
exit(1);
}
int opt=1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,
&opt,sizeof(opt));
struct sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&serveraddr.sin_addr.s_addr);
printf("I will broadcast...\n");
char *info="Night00";
size_t size=strlen(info)*sizeof(char);
if(sendto(sockfd,info,size,0,
(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
perror("sendto error");
exit(1);
}else{
printf("broadcast success\n");
}
close(sockfd);
return 0;
}