只是一个初学者练手写的代码
服务器:
// An highlighted block
#include <strings.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PATH "."
typedef struct filedata{
int length;
int fd;
}fdata,*fdata_t;
char dirbuf[1024] = {0};
typedef struct sockaddr *saddr_t;
char exitbuf[32] = "no such name...exit";
char loginbuf[32] = "welcome,log in...";
void* p_Fun(void *arg);
int username(char *,int);
void *chose(void *arg);
void *list_Fun(void *arg);
void *list_Funinit();
void initfun();
void *upload_Fun(void *arg);
fdata_t open_file(char *path);
int main(int argc,char *argv[])
{
initfun();
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if (sockfd < 0){
perror("sock");
return -1;
}
struct sockaddr_in seraddr,cliaddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(9999);
seraddr.sin_addr.s_addr = inet_addr("0.0.0.0");
if(-1 == bind(sockfd,(saddr_t)&seraddr,sizeof(seraddr))){
perror("bind");
return -1;
}
printf("bind!\n");
listen(sockfd,5);
int len = sizeof(cliaddr);
while(1)
{
char buf[32] = {0};
int connfd = accept(sockfd,(saddr_t)&cliaddr,&len);
if(connfd < 0){
perror("connfd");
break;
}
printf("imcoming ip:%s,port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
pthread_t pid;
if (0 != pthread_create(&pid,NULL,chose,(void *)connfd)){
perror("p_create");
close(connfd);
break;
}
if(0 != pthread_detach(pid)){
perror("p_detach");
close(connfd);
break;
}
}
close(sockfd);
return 0;
}
void initfun()
{
list_Funinit();
}
void *chose(void* arg)
{
int connfd = (int)arg;
while(1){
char buf[32] = {0};
memset(buf,0,32);
int ret = read(connfd,buf,32);
{
if(ret == 0){
printf("exit!\n");
close(connfd);
return;
}
}
int flag = username(buf,connfd);
if(flag == 1){
break;
}
}
while(1)
{
char buf[32]={0},modbuf[32]={0};
int ret = read(connfd,buf,1);
if(ret == 0){
printf("exit\n");
close(connfd);
return;
}
void *(*p)(void *) = NULL;
switch(buf[0]){
case '1' :
p = list_Fun;
strcpy(modbuf,"fun1");
write(connfd,modbuf,32);
printf("文件目录传输!\n");
break;
case '2' :
p=p_Fun;
strcpy(modbuf,"fun2");
write(connfd,modbuf,32);
printf("文件传输函数启动!\n");
break;
case '3' :
p=upload_Fun;
strcpy(modbuf,"fun3");
write(connfd,modbuf,32);
printf("文件上传函数!\n");
break;
default:
strcpy(modbuf,"error");
write(connfd,modbuf,32);
}
if(p!=NULL)
p((void *)connfd);
}
}
fdata_t open_file(char *path)
{
fdata_t sfp = NULL;
int fd1 = open(path,O_RDWR|O_CREAT,0666);
if(fd1 < 0){
perror("openfile");
return sfp;
}
sfp = (fdata_t)malloc(sizeof(fdata));
sfp->length = lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET);
sfp->fd = fd1;
return sfp;
}
void* p_Fun(void *arg)
{
char buf[32]={0};
int connfd = (int)arg;
int ret = read(connfd,buf,32);
fdata_t sfp = open_file(buf);
int i = 0;
if(sfp == NULL){
write(connfd,(char *)&i,4);
fprintf(stderr,"fsp is NULL!");
free(sfp);
return;
}
int length = sfp->length;
int fd = sfp->fd;
free(sfp);
printf("length:%d\n",length);
ret = write(connfd,(unsigned char *)&length,4);
if(ret != 4){
perror("write");
close(fd);
return;
}
int sendsize = 0,netsize;
char rbuf[1024] = {0};
while((ret = read(fd,rbuf,sizeof(rbuf)))>0)
{
sendsize = 0;
while(sendsize < ret){
netsize = write(connfd,rbuf+sendsize,ret-sendsize);
if(netsize<0){
close(fd);
return;
}
sendsize += netsize;
}
printf("size:%d\n",sendsize);
memset(rbuf,0,sizeof(rbuf));
}
printf("ok\n");
close(fd);
return;
}
int username(char *str,int connfd)
{
//******************链表*********************//
char userpswd[5][16]={{"20090214 1\0"},{"20090213 2\0"}};
int flag = 0,i=0;
for(i=0;i<5;i++){
if (!(strcmp(str,"20090214 1"))){
printf("flag = 1\n");
flag = 1;
break;
}
}
//******************************************//
if(flag == 0){
printf("eg:%s\n",exitbuf);
write(connfd,exitbuf,32);
return 0;
}
else if(flag ==1 ){
printf("eg:%s\n",loginbuf);
write(connfd,loginbuf,32);
return 1;
}
}
void *list_Fun(void *arg)
{
int connfd = (int)arg;
int ret = write(connfd,dirbuf,1024);
return;
}
void *list_Funinit()
{
DIR *dp = NULL;
struct dirent *ptr = NULL;
if((dp = opendir(PATH))==NULL){
perror("opendir");
return;
}
printf("list:");
while((ptr = readdir(dp))!=NULL){
if(!((strcmp(ptr->d_name,".")==0)||(strcmp(ptr->d_name,"..")==0))){
strcat(dirbuf,ptr->d_name);
strcat(dirbuf," ");
}
}
printf("%s\n",dirbuf);
}
void *upload_Fun(void *arg)
{
printf("upload funstart\n");
int connfd = (int)arg;
char buf[32] = {0};
int ret = read(connfd,buf,32);
strcat(buf,".cpy");
fdata_t sfp = open_file(buf);
int length = sfp->length;
int fd = sfp->fd;
memset(buf,0,32);
ret = read(connfd,(char *)&length,4);
if(ret != 4){
fprintf(stderr,"read");
close(fd);
close(connfd);
return;
}
printf("length:%d\n",length);
char ubuf[1024] = {0};
int recvsize = 0;
while(1)
{
memset(ubuf,0,1024);
ret = read(connfd,ubuf,1024);
if(ret <=0 ){
perror("read");
free(sfp);
close(fd);
close(connfd);
return;
}
write(fd,ubuf,ret);
recvsize += ret;
printf("recv:%d\n",recvsize);
if(recvsize >= length){
printf("ok\n");
free(sfp);
close(fd);
return;
}
}
}
客户端:
#include <strings.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <arpa/inet.h>
typedef void(*p)(int);
typedef struct sockaddr *saddr_t;
typedef struct filedata{
int fd;
int length;
}fdata,*fdata_t;
fdata_t open_file(char *);
int username(int sockfd);
void fun1(int);
void fun2(int);
void fun3(int);
int main(int argc,char *argv[])
{
if(argc<2){
printf("[sg]: %s [ip]\n",argv[0]);
return;
}
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0){
perror("sock");
return -1;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(9999);
seraddr.sin_addr.s_addr = inet_addr(argv[1]);
if(-1 == connect(sockfd,(saddr_t)&seraddr,sizeof(seraddr))){
perror("connect");
return 0;
}
printf("connect\n");
while(1)
{
int flag = username(sockfd);
if(flag == 1){
printf("login is ok\n");
break;
}
else{
printf("wrong!\n");
}
}
while(1)
{
char buf[32]={0},modbuf[32]={0};
printf("请输入需要的功能序号:\n");
printf("1.列出可传输的文件名:\n");
printf("2.从服务器下载文件:\n");
printf("3.上传文件到服务器:\n");
fgets(buf,32,stdin);
int ret = write(sockfd,buf,1);
read(sockfd,modbuf,32);
if(strcmp(modbuf,"error")!=0){
if(strcmp(modbuf,"fun1")==0){
fun1(sockfd);
}
else if(strcmp(modbuf,"fun2")==0){
fun2(sockfd);
}
else if(strcmp(modbuf,"fun3")==0){
fun3(sockfd);
}
}
}
return 0;
}
int username(int sockfd)
{
char ubuf[32] = {0},pbuf[32]= {0};
printf("请输入您的用户名:");
fflush(stdout);
fgets(ubuf,32,stdin);
ubuf[strlen(ubuf)-1] = '\0';
if(strlen(ubuf)>16){
printf("username is too long\n");
return 0;
}
printf("请输入您的密码:");
fflush(stdout);
fgets(pbuf,32,stdin);
pbuf[strlen(pbuf)-1] = '\0';
if(strlen(pbuf)>16){
printf("password is too long\n");
return 0;
}
strcat(ubuf," ");
strcat(ubuf,pbuf);
write(sockfd,ubuf,32);
memset(pbuf,0,32);
read(sockfd,pbuf,32);
int flag = strcmp(pbuf,"welcome,log in...");
if(flag == 0){
return 1;
}
else
return 0;
}
void fun1(int sockfd)
{
printf("list fun!\n");
char buf[1024] = {0};
int ret = read(sockfd,buf,1024);
if(ret <= 0){
printf("exit!\n");
return;
}
printf("list:%s\n",buf);
}
void fun2(int sockfd)
{
printf("请输入需要下载的文件名:");
fflush(stdout);
char buf[32] = {0};
fgets(buf,32,stdin);
buf[strlen(buf)-1]='\0';
int length=0;
write(sockfd,buf,32);
strcat(buf,".cpy");
printf("open file:%s\n",buf);
fdata_t sfp = open_file(buf);
int fd = sfp->fd;
free(sfp);
memset(buf,0,32);
int ret = read(sockfd,(unsigned char *)&length,4);
printf("filesize:%d\n",length);
if(ret != 4){
perror("read");
return;
}
if(length == 0){
fprintf(stderr,"no such file");
return;
}
int recvsize = 0;
char ubuf[1024] = {0};
while(1){
memset(ubuf,0,sizeof(ubuf));
int ret = read(sockfd,ubuf,sizeof(ubuf));
if(ret == 0){
close(sockfd);
return;
}
write(fd,ubuf,ret);
recvsize += ret;
printf("recvsize:%d\n",recvsize);
if(recvsize >= length){
close(fd);
printf("ok\n");
break;
}
}
}
void fun3(int sockfd){
printf("请输入需要上传文件的名字");
char buf[32]={0};
fgets(buf,32,stdin);
buf[strlen(buf)-1]='\0';
fdata_t sfp = open_file(buf);
int length = sfp->length;
int fd = sfp->fd;
free(sfp);
write(sockfd,buf,32);
int ret = write(sockfd,(unsigned char*)&length,4);
if(ret != 4){
perror("write");
return;
}
printf("length:%d\n",length);
char ubuf[1024] = {0};
int sendsize = 0,netsize;
while(ret = read(fd,ubuf,sizeof(ubuf))){
sendsize = 0;
while(sendsize < ret){
netsize = write(sockfd,ubuf+sendsize,ret-sendsize);
if(netsize<0){
close(fd);
return;
}
sendsize +=netsize;
}
printf("sendsize:%d\n",sendsize);
memset(ubuf,0,sizeof(ubuf));
}
printf("ok!\n");
close(fd);
return;
}
fdata_t open_file(char *path)
{
fdata_t sfp = NULL;
int fd1 = open(path,O_RDWR|O_CREAT,0666);
if(fd1 < 0){
perror("openfile");
return sfp;
}
sfp = (fdata_t)malloc(sizeof(fdata));
sfp->length = lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET);
sfp->fd = fd1;
return sfp;
}