设置获取网络属性
int getsockopt(int sockfd,int level,int optname,voidoptval,socklen_t optlen);
int setsockopt(int sockfd,int level,int optname,void*optval,socklen_t optlen);
广播
-
主机之间一对多的通信模式,网络对其中每一台主机发送的数据都进行无条件复制
-
所有主机都可以接收到所有广播信息,无论是否需要
-
禁止广播数据穿过路由器,只做局域网通信
-
只有udp可以广播
-
广播IP 有效网络号+全1主机号
组播 -
主机之间一对一组的通信方式
组播地址 D类224.0.0.0–239.255.255.255
发送放类似udp的客户端
接收方类似服务端(加入多播组setsockopt)
ftp上传文件
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"line:%d,%s %s",__LINE__,__FILE__,__func__);\
perror(msg);\
}while(0);
int main(int argc, const char *argv[])
{
int cfd =socket(AF_INET,SOCK_DGRAM,0);
if(cfd<0) {
ERR_MSG("socket")
return -1;
}
char data[516] = "";
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(69);
sin.sin_addr.s_addr=inet_addr("192.168.1.15");
int size = sprintf(data,"%c%c%s%c%s%c",0,2,"4.png",0,"octet",0);
int res = sendto(cfd,data,size,0,(struct sockaddr*)&sin,sizeof(sin));
if(res<0) {
ERR_MSG("send req")
return -1;
}
struct sockaddr_in sin1;
socklen_t addrlen=sizeof(sin1);
short* ps=(short*)data;
int datalen=0,blockNo=0;
int fd = open("./4.png",O_RDONLY);
if(fd==-1) {
ERR_MSG("open file")
return -1;
}
while(1) {
bzero(data,sizeof(data));
if((datalen=recvfrom(cfd,data,sizeof(data),0,(struct sockaddr*)&sin1,&addrlen))<0) {
ERR_MSG("recvfrom")
return -1;
}
if(4==ntohs(*ps)) {
*ps = htons(3);
*(ps+1)=htons(++blockNo);
if((datalen = read(fd,data+4,sizeof(data)-4))<=0) {
ERR_MSG("read")
return -1;
}
if(sendto(cfd,data,datalen+4,0,(struct sockaddr*)&sin1,sizeof(sin1))<0) {
ERR_MSG("sendto")
return -1;
}
if(datalen<512) {
printf("success\n");
break;
}
} else break;
}
close(fd);
close(cfd);
return 0;
}