網路程式設計Demo, 下載檔案。
阿新 • • 發佈:2019-01-02
將以前一篇Demo調整下格式, 另外此程式碼不完善, 僅做網路通訊API測試Demo, 客戶端接收資料有BUG,可能因為傳送端傳送太快, 以及接收端接收位元組數量不對引起。
另外發現同一機器做測試Socket通訊資料為記憶體拷貝, 會導致原發送的檔案大小有變化,變化數量跟實際傳送的資料大小有關。
客戶端程式碼
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <string.h>
#include<unistd.h>
#define BUFF_SIZE 100
int main(int argv,char *args[]){
int servsock;
struct sockaddr_in servaddr;
if(argv!=3){
printf("Usage:%s <ip><port>\n",args[0]);
exit(1);
}
servsock = socket(PF_INET,SOCK_STREAM,0);
if(servsock == -1)
{
printf("socket() error\n");
exit(1);
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(args[1]);
servaddr.sin_port = htons(atoi(args[2]));
if(connect(servsock,(struct sockaddr*)&servaddr, sizeof(servaddr)) ==-1)
{
printf("connect() error. %s:%s\n", args[1], args[2]);
exit(1);
}else{
printf("connected.....%s:%s\n", args[1], args[2]);
}
printf("please input filename:");
char filename[BUFF_SIZE];
memset(filename,0,sizeof(char)*BUFF_SIZE);
scanf("%s",filename);
write(servsock,filename,strlen(filename));
int successFlag;
read(servsock,&successFlag,sizeof(successFlag));
if(successFlag!=1){
printf("input file is not existed!\n successFlag is %d\n",successFlag);
exit(1);
}else{
FILE *fp = fopen(filename,"w");
while(1){
memset(filename,0,BUFF_SIZE);
int revlen = read(servsock,filename,BUFF_SIZE);
if(revlen ==0)
break;
fputs(filename,fp);
}
fclose(fp);
printf("complete!\n");
}
close(servsock);
return 0;
}
服務端程式碼
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#define MAX_SEND_LENGTH 65536
int main(int argv,char *args[]){
int servsock,clntsock;
struct sockaddr_in servaddr,clntaddr;
if(argv!=2){
printf("Usage:%s <port>\n", args[0]);
exit(1);
}
servsock = socket(PF_INET,SOCK_STREAM,0);
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(atoi(args[1]));
if(bind(servsock,(struct sockaddr*)&servaddr,sizeof(servaddr)) ==-1)
{
printf("bind() error\n");
exit(1);
}
if(listen(servsock,5) ==-1)
{
printf("listen() error %s\n", args[1]);
exit(1);
}
else
{
printf("socket listen to %s\n", args[1]);
}
socklen_t len = sizeof(clntaddr);
clntsock = accept(servsock, (struct sockaddr*)&clntaddr, &len);
char filename[100];
memset(filename, 0, 100);
read(clntsock, filename, 100);
printf("receiver filename is: %s\n",filename);
FILE *fp = fopen(filename, "r+b");
int successFlag = 1;
if(!fp)
{
successFlag = 0;
write(clntsock, &successFlag, sizeof(successFlag));
printf("NULL\n");
close(clntsock);
close(servsock);
return 0;
}
write(clntsock, &successFlag, sizeof(successFlag));
fseek(fp, 0, SEEK_END);
uint32_t uDataLen = ftell(fp);
fseek(fp, 0, SEEK_SET);
printf("will be send data: %s, len = %u Byte\n", filename, uDataLen);
uint8_t * ptempFileData = new uint8_t[uDataLen];
uint8_t * pSendBuffer = new uint8_t[uDataLen];
fread(ptempFileData, 1, uDataLen, fp);
memcpy(pSendBuffer, ptempFileData, uDataLen);
delete ptempFileData;
uint32_t cursor = 0;
while(cursor < uDataLen)
{
uint32_t sendLen = uDataLen - cursor;
if(sendLen > MAX_SEND_LENGTH)
sendLen = MAX_SEND_LENGTH;
cursor += sendLen;
write(clntsock, pSendBuffer + cursor, sendLen);
printf("sent length: %d Byte\n", cursor);
}
printf("sent complete: %d Byte\n", uDataLen);
fclose(fp);
delete pSendBuffer;
close(clntsock);
close(servsock);
return 0;
}