Linux下UDP通訊開發

服務器部分


#include"protocol.h"
#include"sys/types.h"
#include"sys/socket.h"
#include"string.h"
#include"stdio.h"
#include"stdlib.h"
#include"netinet/in.h"
#include"fcntl.h"


int main()
{


int sockfd;
int writefd,readfd;
struct sockaddr_in server,client;
char recvbuf[1000];
char readbuf[1000];
char sendbuf[1000];
char writebuf[1000];
struct protocol *pro,*repro;
int checkcode;
int run =1;




socklen_t len;
server.sin_addr.s_addr=inet_addr("127.0.1");
server.sin_port=htons(12345);
server.sin_family=AF_INET;
len =sizeof(server);
sockfd = socket(AF_INET,SOCK_DGRAM,0);


bind(sockfd,(struct sockaddr*)&server,len);




while(run)
{




recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&client,&len);
repro = (struct protocol*)malloc(sizeof(struct protocol));
pro = (struct protocol*)malloc(sizeof(struct protocol));
memcpy(repro,recvbuf,sizeof(recvbuf));
int select;


switch(repro->command)
{


case SHUTDOWN:


pro->command=SHUTDOWN;
pro->no=checkcode++;
strcpy(pro->buf,"nullptr");
pro->len=strlen("nullptr");
run=0;

break;


case DOWNLOAD:

pro->no=++repro->no;
        if(-1==(readfd=open(repro->buf,O_RDWR,0666)))
{
pro->command=NO;
printf("yes---------->\n");
}
else
{
pro->command=YES;
printf("no:---------->\n");
}
strcpy(pro->buf,"nullptr");
pro->len=strlen("nullptr");
break;


case UPLOAD:
printf("client want to upload a file ,do you allow?\n");
printf("      1 START    other no \n");scanf("%d",&select);
if(select==1)
{
pro->command=START;
pro->no=checkcode++;
strcpy(pro->buf,"nullptr");
pro->len= sizeof("nullptr");
writefd=open(repro->buf,O_RDWR|O_CREAT,0666);
}
          else
 {


pro->command=NO;
pro->no=checkcode++;
strcpy(pro->buf,"nullptr");
pro->len= sizeof("nullptr");


 }


break;


case START:


read(readfd,readbuf,sizeof(readbuf));
pro->command=CONTENT;
pro->no=checkcode++;
strcpy(pro->buf,readbuf);
pro->len=strlen(readbuf);
memcpy(sendbuf,pro,INFOLEN);
        sendto(sockfd,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&client,len);
printf("wait to finish download.........\n");
        free(pro);


pro = (struct protocol*)malloc(sizeof(struct protocol));
pro->command=END;
pro->no=checkcode++;
strcpy(pro->buf,"EDN");
pro->len=strlen("EDN");
break;


case CONTENT:


write(writefd,repro->buf,sizeof(repro->buf));
close(writefd);
printf("upload will be finish\n");
break;
case END:
     printf("\t  upload is ok \n");
break;
default :
printf("default command :%d\n",repro->command);
pro->command=100;
pro->no=0;
strcpy(pro->buf,"connect");
pro->len=strlen("connect");
break;


}






memcpy(sendbuf,pro,INFOLEN);
        sendto(sockfd,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&client,len);
printf("\tcommand-->%d\n\tlen------>%d\n\tno------->%d\n\tbuf------>%s\n",
pro->command,pro->len,pro->no,pro->buf);
        free(pro);
free(repro);


}


close(sockfd);


return 0;

}


客戶端部分



#include"protocol.h"
#include"sys/types.h"
#include"sys/socket.h"
#include"string.h"
#include"stdio.h"
#include"stdlib.h"
#include"netinet/in.h"
#include"fcntl.h"


int main()
{
int sockfd;
int run=1;
int slip=1;
int writefd;
int readfd;
struct sockaddr_in server,client;
char recvbuf[1000];
char readbuf[1000];
char writebuf[1000];
struct protocol *pro,*repro;
char sendbuf[INFOLEN];
char filename[20];
socklen_t len;
server.sin_addr.s_addr=inet_addr("127.0.1");
server.sin_port=htons(12345);
server.sin_family=AF_INET;
len =sizeof(server);
sockfd = socket(AF_INET,SOCK_DGRAM,0);


 int checkcode=0;
 pro=(struct protocol*)malloc(sizeof(struct protocol));
char inputbuf[1000];


//first connect 
 pro->command=100;
 pro->no=0;
 strcpy(pro->buf,"nullptr");
   pro->len=strlen("nullptr");
 memcpy(sendbuf,pro,INFOLEN);
      sendto(sockfd,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&server,len);
 printf("\t  connect .............\n");
      free(pro);  






while(run)
{

   repro = (struct protocol*)malloc(sizeof(struct protocol));
   pro=(struct protocol*)malloc(sizeof(struct protocol));
   recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&server,&len);
   memcpy(repro,recvbuf,sizeof(recvbuf));




switch(repro->command)
{


case YES:
     //download  yes




 pro->command=START;
 pro->no=checkcode++;
 strcpy(pro->buf,"nullptr");
     pro->len=strlen("nullptr");
 memcpy(sendbuf,pro,INFOLEN);
          sendto(sockfd,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&server,len);
 printf("\t download is yes     \n");
          free(pro);
 slip=0;
     pro=(struct protocol*)malloc(sizeof(struct protocol));
      break;


case CONTENT:


writefd=open(filename,O_RDWR|O_CREAT,0666);
write(writefd,repro->buf,strlen(repro->buf));
close(writefd);
printf("download is ok cloent\n");
break;
case NO:
//download no


  printf("\thave no such file\n");
break;


case START:
    //upload start
readfd=open(filename,O_RDWR|O_CREAT,0666);
read(readfd,readbuf,sizeof(readbuf));
 pro->command=CONTENT;
 pro->no=checkcode++;
 strcpy(pro->buf,readbuf);
     pro->len=strlen(readbuf);
 memcpy(sendbuf,pro,INFOLEN);
          sendto(sockfd,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&server,len);
 printf("\t  upload is start    \n");
          free(pro);
pro=(struct protocol*)malloc(sizeof(struct protocol));
  
 pro->command=END;
 pro->no=checkcode++;
 strcpy(pro->buf,"END");
     pro->len=strlen("END");
 memcpy(sendbuf,pro,INFOLEN);
          sendto(sockfd,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&server,len);
break;


case SHUTDOWN:
    //service had shutdown


run =0;
break;
case END:
printf("\t download is ok \n");
   slip=1;
break;


default :
printf("default  ............%d \n",repro->command);
break;


}


free(repro);


if(run+slip>=2)
{


printf("\t*********************************************************\n");
printf("\t***********************    Client   *********************\n");
printf("\t*********************************************************\n");
printf("\t***********************  0 SHUTDOWN    ******************\n");
printf("\t***********************  1 DOWNLOAD    ******************\n");
printf("\t***********************  3 UPLOAD      ******************\n");
printf("\t*********************************************************\n");
printf("please input a num:\t");int n;scanf("%d",&n);




switch(n)
{


case SHUTDOWN:


pro->command=SHUTDOWN;
pro->no=checkcode++;
strcpy(pro->buf,"nullptr");
pro->len=strlen("nullptr");

break;


case DOWNLOAD:
pro->command=DOWNLOAD;
pro->no=checkcode++;
        printf("\t please input the name of the download-file:\t");scanf("%s",&inputbuf);
strcpy(pro->buf,inputbuf);


strcpy(filename,inputbuf);
pro->len=strlen(inputbuf);
break;


case UPLOAD:


pro->command=UPLOAD;
pro->no=checkcode++;
        printf("\t please input the name of the upload-file):\t");scanf("%s",&inputbuf);
strcpy(pro->buf,inputbuf);
strcpy(filename,inputbuf);
pro->len=strlen(inputbuf);
break;


default :
break;


}


memcpy(sendbuf,pro,INFOLEN);
        sendto(sockfd,sendbuf,sizeof(sendbuf),0,(struct sockaddr *)&server,len);
printf("\tcommand-->%d\n\tlen------>%d\n\tno------->%d\n\tbuf------>%s\n",
pro->command,pro->len,pro->no,pro->buf);


}
}
close(sockfd);
return 0;

}


協議結構體



#ifndef _protocol
#define _protocol


#define INFOLEN 1000
#define SHUTDOWN 0
#define DOWNLOAD 1
#define UPLOAD 2
#define YES 3
#define NO 4
#define START 5
#define END 6
#define CONTENT 7
#define OK 8


struct protocol
{
int command;
int len;  //length of buf
int no;
char buf[INFOLEN];
};
#endif


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章