将以前一篇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;
}