UDPsocket简单编程

一、接收端

//申请套接字
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd<0)
    {
        perror("socket fail");
        return -1;
    }

设置复用端口

    //设置端口复用
	int op = 1;
	int opt = setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &op, sizeof(op));
	if(opt < 0)
	{
		perror("setsockopt fail");
		return -1;
	}

3、绑定

//绑定
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(8888);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);

    int ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    char recvbuf[1024]={0};
    struct sockaddr_in recvaddr;
    socklen_t len = sizeof(recvaddr);
    //接收连接问候语
    size_t size = recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&recvaddr,&len);
    if(size<0)
    {
        perror("recvfrom fail");
        return -1;
    }
    printf("%s",recvbuf);
    //接收文件信息
    int filesize = 0;
    char filename[256]={0};
    recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&recvaddr,&len);
    
    //接收文件大小
    memcpy(&filesize,recvbuf,sizeof(int));
    //获取文件名
    memcpy(filename,recvbuf+4,strlen(recvbuf)-4);

    //获取文件数据内容大小
    char filedatasize[1024]={0};
    ret = recvfrom(sockfd,filedatasize,sizeof(filedatasize),0,(struct sockaddr*)&recvaddr,&len);
    if(ret < 0)
    {
        perror("recv filedatasize fail");
        return -1;
    }
    //新建文件
    if(createNewfile(filename,filesize,filedatasize))
    {
        printf("接收完成\n");
    }
    close(sockfd);
    return 0;
}


bool createNewfile(const char*filenames,int filesize,const char* filedata)
{
    FILE* fp = 0;
    char filename[1024]="./demo.c";
    fp = fopen(filename,"w+");
    if(fp == 0)
    {
        perror("fp open fail");
        return false;
    }

    fseek(fp,filesize,0);
    rewind(fp);
    //写文件
    size_t ret = fwrite(filedata,strlen(filedata),1,fp);
    if(ret < 0)
    {
        perror(" write new file fail");
        return false;
    }
    return true;
}

二、发送端

/*************************************************************************
    > File Name: udp_send.c
    > Author: joe
    > Mail: 1187108941@qq.com 
    > Created Time: Tue Feb 18 12:12:04 2020
 ************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> 
#include <string.h>

int main(int argc,char** argv) {

    //申请套接字
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd<0)
    {
        perror("socket fail");
        return -1;
    }
    

    //绑定
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(8888);
    saddr.sin_addr.s_addr = inet_addr("192.168.2.101");
    char hellobuf[128]="hello i am joe";
    size_t size = sendto(sockfd,hellobuf,strlen(hellobuf),0,(struct sockaddr*)&saddr,sizeof(saddr));
    if(size<0)
    {
        perror("sendto fail");
        return -1;
    }

    //开始发送文件,读取文件
    char filedata[1024]={0};
    char filepath[1024]={0};
    scanf("%s",filepath);

//打开文件
    FILE *fp = 0;
    fp = fopen(filepath,"r");
    if(fp ==0)
    {
        perror("open fail");
        return -1;
    }
    fread(filedata,sizeof(filedata),1,fp);
    fseek(fp,0,2);
    int filesize = ftell(fp);
    char filemsg[1024]={0};
    memcpy(filemsg,&filesize,4);
    memcpy(filemsg+4,filepath,strlen(filepath));

    //发送
    size = sendto(sockfd,filemsg,strlen(filemsg),0,(struct sockaddr*)&saddr,sizeof(saddr));
    if(size<0)
    {
        perror("send filemsg fail");
        return -1;
    }
    //发送文件内容

    size = sendto(sockfd,filedata,strlen(filedata),0,(struct sockaddr*)&saddr,sizeof(saddr));
    if(size<0)
    {
        perror("send filemsg fail");
        return -1;
    }
    close(sockfd);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值