作業1:廣播
發送端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.創建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//2.設置當前套接字允許廣播屬性int broadcast=-1;if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1){perror("setsockopt error");return -1;}//3.綁定(非必須)//4.填充地址信息結構體struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=(8888); //廣播端口號sin.sin_addr.s_addr=inet_addr("192.168.199.255"); //廣播地址//5.發送數據char sbuf[128]="";while(1){//從終端獲取數據printf("請輸入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//發送數據sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("發送成功\n");}//6.關閉套接字close(sfd);return 0;
}
接收端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.創建套接字int cfd=socket(AF_INET,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.綁定//填充地址信息結構體struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=(8888); //廣播端口號cin.sin_addr.s_addr=inet_addr("192.168.199.255"); //廣播地址//綁定if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.接收數據char rbuf[128]="";while(1){//清空數據bzero(rbuf,sizeof(rbuf));//讀取消息recvfrom(cfd,rbuf,sizeof(rbuf),0,NULL,NULL);printf("收到的消息為:%s\n",rbuf);}//4.關閉套接字close(cfd);return 0;
}
效果圖:
作業2:組播
發送端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.創建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//2.綁定(非必須)//3.發送消息//填充地址信息結構體struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(8888); //組播端口號sin.sin_addr.s_addr=inet_addr("224.1.1.2"); //組播IPchar sbuf[128]="";while(1){//從終端獲取數據printf("請輸入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//發送數據sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("發送成功\n");}//4.關閉套接字close(sfd);return 0;
}
接收端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.創建套接字int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}printf("rfd=%d\n",rfd);//2.加入多播組struct ip_mreqn imr;imr.imr_multiaddr.s_addr=inet_addr("224.1.1.2"); //組播ipimr.imr_address.s_addr=inet_addr("192.168.199.131"); //本機ipimr.imr_ifindex=2; //網卡編號if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&imr,sizeof(imr))==-1){perror("setsockopt error");return -1;}//3.綁定//填充地址信息結構體struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(8888); //組播端口號rin.sin_addr.s_addr=inet_addr("224.1.1.2"); //組播ip//綁定if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return -1;}printf("bind success\n");//4.接收組播消息char rbuf[128]="";while(1){//清空消息bzero(rbuf,sizeof(rbuf));//接收消息recvfrom(rfd,rbuf,sizeof(rbuf),0,NULL,NULL);printf("收到的消息為:%s\n",rbuf);}//5.關閉套接字close(rfd);return 0;
}
效果圖:
作業3:流式域套接字
服務器端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.創建套接字int sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}//2.判斷文件是否存在,存在則刪除if(access("./mysocket",F_OK)==0){//存在,刪除if(unlink("./mysocket")==-1){perror("unlink error");return -1;}}//3.綁定//填充地址信息結構體struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./mysocket");//綁定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//4.開啟監聽if(listen(sfd,128)==-1){perror("listen error");return -1;}//5.阻塞等待客戶端連接struct sockaddr_un cun;socklen_t socklen=sizeof(cun);int newfd=-1;if((newfd=accept(sfd,(struct sockaddr*)&cun,&socklen))==-1){perror("accept error");return -1;}printf("您有新用戶發來請求\n");//6.進行數據收發char rbuf[128]="";while(1){//清空數據bzero(rbuf,sizeof(rbuf));//接收數據recv(newfd,rbuf,sizeof(rbuf),0);printf("[%s]:%s\n",cun.sun_path,rbuf);strcat(rbuf," !!!");//發送消息send(newfd,rbuf,strlen(rbuf),0);printf("發送成功\n");}//7.關閉套接字close(sfd);close(newfd);return 0;
}
客戶端:
#include <myhead.h>int main(int argc, const char *argv[])
{//1.創建套接字int cfd=socket(AF_UNIX,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}//2.判斷文件是否存在,存在則刪除if(access("./mysocket1",F_OK)==0){//存在,刪除if(unlink("./mysocket1")==-1){perror("unlink error");return -1;}}//3.綁定(非必須)//填充地址信息結構體struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./mysocket1");//綁定if(bind(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//4.連接服務器struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./mysocket");if(connect(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("connect error");return -1;}printf("connect success\n");//5.進行數據收發char wbuf[128]="";while(1){//清空數據bzero(wbuf,sizeof(wbuf));//從終端獲取數據printf("請輸入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;if(strcmp(wbuf,"quit")==0){break;}//發送消息send(cfd,wbuf,strlen(wbuf),0);printf("發送成功\n");//接收服務器發來的消息bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到的消息為:%s\n",wbuf);}//7.關閉套接字close(cfd);return 0;
}
效果圖:
作業4:報式域套接字
服務器端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.創建套接字int sfd=socket(AF_UNIX,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//2.判斷文件是否存在,存在則刪除if(access("./linux",F_OK)==0){//存在,刪除if(unlink("./linux")==-1){perror("unlink error");return -1;}}//3.綁定//填充地址信息結構體struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");//綁定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//6.進行數據收發char rbuf[128]="";//定義地址信息結構體struct sockaddr_un cun;socklen_t socklen=sizeof(cun);while(1){//清空數據bzero(rbuf,sizeof(rbuf));//接收數據recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cun,&socklen);printf("收到的消息為:%s\n",rbuf);strcat(rbuf," !!!");//發送消息sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cun,socklen);}//7.關閉套接字close(sfd);return 0;
}
客戶端:
#include <myhead.h>int main(int argc, const char *argv[])
{//1.創建套接字int cfd=socket(AF_UNIX,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}//2.判斷文件是否存在,存在則刪除if(access("./linux1",F_OK)==0){//存在,刪除if(unlink("./linux1")==-1){perror("unlink error");return -1;}}//3.綁定//填充地址信息結構體struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux1");//綁定if(bind(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//5.進行數據收發char wbuf[128]="";//定義地址信息結構體struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"linux");while(1){//清空數據bzero(wbuf,sizeof(wbuf));//從終端獲取數據printf("請輸入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;if(strcmp(wbuf,"quit")==0){break;}//發送消息sendto(cfd,wbuf,strlen(wbuf),0,(struct sockaddr*)&cun,sizeof(cun));printf("發送成功\n");//接收服務器發來的消息bzero(wbuf,sizeof(wbuf));recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);printf("收到的消息為:%s\n",wbuf);}//7.關閉套接字close(cfd);return 0;
}
效果圖: