1.上传/下载
// 下载
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#define PORT 69
#define IP "192.168.8.110"
#define PRINT_ERR(msg) \
do \
{ \
perror(msg); \
return -1; \
} \
while (0)
int main(int argc, const char *argv[])
{
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (0 > sfd)
PRINT_ERR("socket");
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
// if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin)) > 0)
// PRINT_ERR("bind");
int res;
char buff[516] = "";
unsigned short int *phead = (unsigned short int *)buff;
*phead = htons(1);
char *pfile = buff + 2;
strcpy(pfile,argv[1]);
printf("%s\n",pfile);
char *pmode = pfile + strlen(pfile) + 1;
strcpy(pmode,"octet");
printf("%s\n",pmode);
int size = 2 + strlen(pmode) + 1 + strlen(pfile) + 1;
printf("%d\n",size);
res = sendto(sfd,buff,size,0,(struct sockaddr *)&sin,sizeof(sin));
printf("请求成功\n");
int len = sizeof(sin);
FILE *fp = fopen("0.jpeg","w+");
if(NULL == fp)
PRINT_ERR("fopen 0.png");
while(1)
{
res = recvfrom(sfd,buff,516,0,(struct sockaddr *)&sin,&len);
if(ntohs(*phead) == 5)
PRINT_ERR("recv");
fwrite(buff+4,512,1,fp);
if(res < 512)
break;
// if(res < 0)
// PRINT_ERR("fwrite");
*phead = htons(4);
res = sendto(sfd,buff,4,0,(struct sockaddr *)&sin,sizeof(sin));
}
close(sfd);
fclose(fp);
return 0;
}
// s上传
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#define PORT 69
#define IP "192.168.8.110"
#define PRINT_ERR(msg) \
do \
{ \
perror(msg); \
return -1; \
} while (0)
int main(int argc, const char *argv[])
{
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sfd) if (-1 == sfd)
PRINT_ERR("sock");
struct sockaddr_in cin,sin;
cin.sin_family = AF_INET;
cin.sin_port = htons(PORT);
cin.sin_addr.s_addr = inet_addr(IP);
char buff[516] = "";
// 请求头
sprintf(buff,"%c%c%s%c%s%c",0,2,argv[1],0,"octet",0);
int size = 2 + strlen(argv[1]) + 1 + strlen("octet") + 1;
printf("%d\n", size);
int cli_len = sizeof(cin);
int ser_len = sizeof(sin);
// 发送请求头
int res = sendto(sfd, buff, size, 0, (struct sockaddr *)&cin, sizeof(cin));
if (res == size)
printf("请求成功\n");
unsigned short int no = 0;
int fp = open("1.jpeg",O_RDONLY);
if(-1 == fp)
PRINT_ERR("fopen 0.jpeg");
while (1)
{
bzero(buff, 516);
res = recvfrom(sfd,buff,516,0,(struct sockaddr *)&sin,&ser_len);
if(buff[1] == 4 && no == ntohs(*(unsigned short*)(buff+2))) // 数据包处理
{
// 发送数据
res = read(fp,buff+4,512); // 读取文件
if(res <= 0)
{
printf("文件发送完毕\n");
break;
}
buff[1] = 3; // 操作码
no++;
*(unsigned short*)(buff+2) = htons(no); // 块编号
if(sendto(sfd,buff,res+4,0,(struct sockaddr *)&sin,ser_len) < 0)
PRINT_ERR("sendto");
}
else if(buff[1] == 5) // 错误号
{
printf("数据发生错误,错误码 = %d\n",buff[3]);
break;
}
else if(*(unsigned short int *)(buff+2) == htons(no)) // 块编码错误
{
printf("块编码错误\n");
break;
}
else // 未知错误
{
printf("其他错误\n");
// printf("buff[1] = %d no = %d\n",buff[1],ntohs(*pno));
break;
}
}
close(sfd);
close(fp);
return 0;
}
2.广播
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#define PORT 8000
#define IP "192.168.126.255"
#define PRINT_ERR(msg) \
do \
{ \
perror(msg); \
return -1; \
} while (0)
int main(int argc, const char *argv[])
{
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sfd < 0)
PRINT_ERR("socket");
// 设置开启广播
int setbroad = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&setbroad,sizeof(setbroad)) < 0)
PRINT_ERR("setsockopt");
// 接收端的 IP 和 PORT
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
char buff[100] = "";
int res;
int sin_len;
while(1)
{
printf("input:");
scanf(" %s",buff);
res = sendto(sfd,buff,sizeof(buff),0,(struct sockaddr*)&sin,sizeof(sin));
if(res == -1)
PRINT_ERR("sendto");
recvfrom(sfd,buff,100,0,(struct sockaddr*)sin,&sin_len);
printf("就收到:%s",buff);
}
return 0;
}