2022-10-22

 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值