概述
组播服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#define ERR_MGS(m)do{
fprintf(stderr,"%dn",__LINE__);
perror(m);
}while(0)
int main(int argc, const char *argv[])
{
//基于UDP的服务器模型
//创建套接字
int scoketd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==scoketd){
ERR_MGS("scoket");
return 0;
}
//允许端口快速重用
int reuse = 1;
if(setsockopt(scoketd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))<0)
{
ERR_MGS("setsockopt");
return -1;
}
//设置加入多播组
struct ip_mreqn eq;
eq.imr_multiaddr.s_addr=inet_addr("224.1.2.3");
eq.imr_address.s_addr=inet_addr("192.168.8.214");
eq.imr_ifindex = if_nametoindex("ens33");
if(setsockopt(scoketd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&eq,sizeof(eq))<0){
ERR_MGS("setsockopt1");
return 0;
}
printf("加入多播组成功n");
printf("创建套接字成功n");
//绑定服务器的ip和端口
//创建结构体变量并填充结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=htons(2222);
cin.sin_addr.s_addr=inet_addr("224.1.2.3");
socklen_t addrlen=sizeof(cin);
int fd=bind(scoketd,(struct sockaddr*)&cin,addrlen);
if(-1==fd){
ERR_MGS("bind");
return 0;
}
printf("绑定成功n");
//接收客户端的信息
ssize_t res;
char buf[128];
struct sockaddr_in sind;
socklen_t addrlen1=sizeof(sind);
while(1){
bzero(buf,sizeof(buf));
res=recvfrom(scoketd,buf,sizeof(buf),0,(struct sockaddr*)&sind,&addrlen1);
if(-1==res){
ERR_MGS("recvfrom");
break;
}
printf("[%s | %d] %sn",inet_ntoa(sind.sin_addr),ntohs(sind.sin_port),buf);
}
//关闭文件描述符
close(scoketd);
return 0;
}
//组播客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define ERR_MGS(m)do{
fprintf(stderr,"%dn",__LINE__);
perror(m);
}while(0)
int main(int argc, const char *argv[])
{
//基于UDP的客户端模型
//创建套接字
int scoketd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==scoketd){
ERR_MGS("scoket");
return 0;
}
//允许端口快速重用
int reuse = 1;
if(setsockopt(scoketd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))<0)
{
ERR_MGS("setsockopt");
return -1;
}
printf("创建套接字成功n");
//绑定客户端的ip和端口
//创建结构体变量并填充结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=htons(8888);
cin.sin_addr.s_addr=inet_addr("192.168.8.214");
socklen_t addrlen=sizeof(cin);
int fd=bind(scoketd,(struct sockaddr*)&cin,addrlen);
if(-1==fd){
ERR_MGS("bind");
return 0;
}
printf("绑定成功n");
//向服务器的发送信息
ssize_t res;
char buf[128];
struct sockaddr_in sind;
sind.sin_family=AF_INET;
sind.sin_port=htons(2222);
sind.sin_addr.s_addr=inet_addr("224.1.2.3");
socklen_t addrlen1=sizeof(sind);
while(1){
printf("请输入>>>n");
bzero(buf,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
res=sendto(scoketd,buf,sizeof(buf),0,(struct sockaddr*)&sind,addrlen1);
if(-1==res){
ERR_MGS("sendto");
break;
}
printf("发送信息成功n");
}
//关闭文件描述符
close(scoketd);
return 0;
}
//广播服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define ERR_MGS(m)do{
fprintf(stderr,"%dn",__LINE__);
perror(m);
}while(0)
int main(int argc, const char *argv[])
{
//基于UDP的服务器模型
//创建套接字
int scoketd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==scoketd){
ERR_MGS("scoket");
return 0;
}
//允许端口快速重用
int reuse = 1;
if(setsockopt(scoketd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))<0)
{
ERR_MGS("setsockopt");
return -1;
}
printf("创建套接字成功n");
//绑定服务器的ip和端口
//创建结构体变量并填充结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=htons(2222);
cin.sin_addr.s_addr=inet_addr("192.168.8.255");
socklen_t addrlen=sizeof(cin);
int fd=bind(scoketd,(struct sockaddr*)&cin,addrlen);
if(-1==fd){
ERR_MGS("bind");
return 0;
}
printf("绑定成功n");
//接收客户端的信息
ssize_t res;
char buf[128];
struct sockaddr_in sind;
socklen_t addrlen1=sizeof(sind);
while(1){
bzero(buf,sizeof(buf));
res=recvfrom(scoketd,buf,sizeof(buf),0,(struct sockaddr*)&sind,&addrlen1);
if(-1==res){
ERR_MGS("recvfrom");
break;
}
printf("[%s | %d] %sn",inet_ntoa(sind.sin_addr),ntohs(sind.sin_port),buf);
//发送信息给客户端
strcat(buf,"*_*");
res=sendto(scoketd,buf,sizeof(buf),0,(struct sockaddr*)&sind,addrlen1);
if(-1==res){
ERR_MGS("sendto");
break;
}
printf("发送信息成功n");
}
//关闭文件描述符
close(scoketd);
return 0;
}
//广播服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define ERR_MGS(m)do{
fprintf(stderr,"%dn",__LINE__);
perror(m);
}while(0)
int main(int argc, const char *argv[])
{
//基于UDP的客户端模型
//创建套接字
int scoketd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==scoketd){
ERR_MGS("scoket");
return 0;
}
//允许端口快速重用
int reuse = 1;
if(setsockopt(scoketd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))<0)
{
ERR_MGS("setsockopt");
return -1;
}
//设置允许广播
int rep=1;
socklen_t len1=sizeof(rep);
int sock=setsockopt(scoketd,SOL_SOCKET,SO_BROADCAST,&rep,len1);
if(-1==sock){
perror("setsockopt1");
return 0;
}
printf("允许广播成功n");
printf("创建套接字成功n");
//绑定客户端的ip和端口
//创建结构体变量并填充结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=htons(6666);
cin.sin_addr.s_addr=inet_addr("192.168.8.214");
socklen_t addrlen=sizeof(cin);
int fd=bind(scoketd,(struct sockaddr*)&cin,addrlen);
if(-1==fd){
ERR_MGS("bind");
return 0;
}
printf("绑定成功n");
//向服务器的发送信息
ssize_t res;
char buf[128];
struct sockaddr_in sind;
sind.sin_family=AF_INET;
sind.sin_port=htons(2222);
sind.sin_addr.s_addr=inet_addr("192.168.8.255");
socklen_t addrlen1=sizeof(sind);
while(1){
printf("请输入>>>n");
bzero(buf,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
res=sendto(scoketd,buf,sizeof(buf),0,(struct sockaddr*)&sind,addrlen1);
if(-1==res){
ERR_MGS("sendto");
break;
}
printf("发送信息成功n");
}
//关闭文件描述符
close(scoketd);
return 0;
}
//基于ttfp协议的上传和下载代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define ERR_MGS(m)do{
fprintf(stderr,"%dn",__LINE__);
perror(m);
}while(0)
int download(int scoketd,struct sockaddr_in sind,socklen_t addrlen1);
int upload(int scoketd,struct sockaddr_in sind,socklen_t addrlen1);
int main(int argc, const char *argv[])
{
//基于UDP的客户端模型
//创建套接字
int scoketd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==scoketd){
ERR_MGS("scoket");
return 0;
}
//允许端口快速重用
int reuse = 1;
if(setsockopt(scoketd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))<0)
{
ERR_MGS("setsockopt");
return -1;
}
printf("创建套接字成功n");
//绑定客户端的ip和端口
//创建结构体变量并填充结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=htons(6666);
cin.sin_addr.s_addr=inet_addr("192.168.8.214");
socklen_t addrlen=sizeof(cin);
int fd=bind(scoketd,(struct sockaddr*)&cin,addrlen);
if(-1==fd){
ERR_MGS("bind");
return 0;
}
printf("绑定成功n");
int option;
struct sockaddr_in sind;
sind.sin_family=AF_INET;
sind.sin_port=htons(69);
sind.sin_addr.s_addr=inet_addr("192.168.8.238");
socklen_t addrlen1=sizeof(sind);
while(1){
printf("*****1.下载*****n");
printf("*****2.上传*****n");
printf("*****3.退出*****n");
printf("请输入选项>>>n");
scanf("%d",&option);
while(getchar()!='n');
switch(option){
case 1:
download(scoketd,sind,addrlen1);
break;
case 2:
upload(scoketd,sind,addrlen1);
break;
case 3:
goto END;
default :
printf("输入格式错误请重新输入n");
break;
}
}
END:
//关闭文件描述符
close(scoketd);
return 0;
}
int download(int scoketd,struct sockaddr_in sind,socklen_t addrlen1){
//向服务器的发送信息
ssize_t res;
//组建发送协议包
char buf[516]="";
short* p=(short*)buf;
*p=htons(1);
char* p1 = buf+2;
printf("请输入要下载的文件名n");
char name[20]="";
scanf("%s",name);
strcpy(p1,name);
char* p2=p1+strlen(p1);
*p2=0;
char* p3=p2+1;
strcpy(p3,"octet");
char* p4=p3+strlen(p3);
*p4=0;
//定义记录数组长度大小的变量记录数组长度
int size=2+strlen(p1)+1+strlen(p3)+1;
printf("p1=%s p3=%s size=%dn",p1,p3,size);
res=sendto(scoketd,buf,size,0,(struct sockaddr*)&sind,addrlen1);
if(-1==res){
ERR_MGS("sendto");
return 0;
}
printf("发送信息成功n");
//打开一个文件用来接收传输过来的信息
umask(0);
int falg=0;
int sdp;
int num=0;
while(1){
bzero(buf,sizeof(buf));
res=recvfrom(scoketd,buf,sizeof(buf),0,(struct sockaddr*)&sind,&addrlen1);
if(-1==res){
ERR_MGS("recvfrom");
break;
}
if(buf[1]==3){
if(htons(num+1) == *(unsigned short*)(buf+2)){
num++;
if(0==falg){
sdp=open("./7.png",O_RDWR|O_CREAT|O_TRUNC, 0777);
if(sdp<0){
ERR_MGS("open");
return 0;
}
}
falg=1;
if(write(sdp,buf+4,res-4)<0){
ERR_MGS("write");
return 0;
}
buf[1]=4;
if(sendto(scoketd,buf,4,0,(struct sockaddr*)&sind,addrlen1)<0){
ERR_MGS("sendto");
return 0;
}
if(res-4<512){
printf("文件下载完毕n");
break;
}
}
}
if(buf[1]==5){
printf("发生未知错误 差错码=%d,错误信息为:%sn",ntohs(*(unsigned short*)(buf+2)),buf+4);
close(sdp);
break;
}
}
close(sdp);
return 0;
}
int upload(int scoketd,struct sockaddr_in sind,socklen_t addrlen1){
//向服务器的发送信息
ssize_t res;
//组建发送协议包
char buf[516]="";
short* p=(short*)buf;
*p=htons(2);
char* p1 = buf+2;
printf("请输入要上传的文件名n");
char name[20]="";
scanf("%s",name);
strcpy(p1,name);
while(getchar()!='n');
char* p2=p1+strlen(p1);
*p2=0;
char* p3=p2+1;
strcpy(p3,"octet");
char* p4=p3+strlen(p3);
*p4=0;
//定义记录数组长度大小的变量记录数组长度
int size=2+strlen(p1)+1+strlen(p3)+1;
printf("p1=%s p3=%s size=%dn",p1,p3,size);
res=sendto(scoketd,buf,size,0,(struct sockaddr*)&sind,addrlen1);
if(-1==res){
ERR_MGS("sendto");
return 0;
}
printf("发送信息成功n");
//打开一个文件用来接收传输过来的信息
umask(0);
int falg=0;
int sdp;
int num=0;
int i=1;
ssize_t std;
while(1){
bzero(buf,sizeof(buf));
res=recvfrom(scoketd,buf,sizeof(buf),0,(struct sockaddr*)&sind,&addrlen1);
if(-1==res){
ERR_MGS("recvfrom");
break;
}
if(buf[1]==4){
if(htons(num) == *(unsigned short*)(buf+2)){
num++;
if(0==falg){
sdp=open(name,O_RDONLY);
if(sdp<0){
ERR_MGS("open");
return 0;
}
}
falg=1;
if((std=read(sdp,buf+4,512))<0){
ERR_MGS("write");
return 0;
}
buf[1]=3;
buf[3]=i;
if(sendto(scoketd,buf,std+4,0,(struct sockaddr*)&sind,addrlen1)<0){
ERR_MGS("sendto");
return 0;
}
i++;
if(std<512){
printf("文件上传完毕n");
break;
}
}
}
if(buf[1]==5){
printf("发生未知错误 差错码=%d,错误信息为:%sn",ntohs(*(unsigned short*)(buf+2)),buf+4);
close(sdp);
break;
}
}
close(sdp);
return 0;
}
最后
以上就是拼搏荔枝为你收集整理的广播服务器和客户端 组播服务器和客户端 基于ttfp协议的上传和下载代码的全部内容,希望文章能够帮你解决广播服务器和客户端 组播服务器和客户端 基于ttfp协议的上传和下载代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复