|
发表于 2003-7-6 23:20:50
|
显示全部楼层
真是对不起的阿
我赶快贴出一个初稿的了
简单的不用子进程或者多线程
服务端只为一个连接服务,客户端只传送一个文本文件
大家可以修改改进
服务端(接收端)
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<netdb.h>
#include<errno.h>
#include<unistd.h>
#define MYPORT 12000
#define BACKLOG 1
#define MAXSIZE 4096
int b_link(int port)//函数说明:创建一个套接口
{
int sockfd,ret,len,con_fd;
struct sockaddr_in ser_addr;
int nsize;
sockfd=socket(AF_INET,SOCK_STREAM,0);//建立一个ip/tcp套接口
if(sockfd<0)
{
printf("error in building a socket\n\a");
return -1;
}
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(port);
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&(ser_addr.sin_zero), ;
ret=bind(sockfd,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr));//端口绑定
if(ret<0)
{
printf("error in binding port\n\a");
return -1;
}
ret=listen(sockfd,1);//端口监听.简单起见,只接受一个请求
if(ret<0)
{
printf("error in listening \n\a");
return -1;
}
return sockfd;
};
int b_access(int sockfd)//接受服务请求,接收文件
{
int con_fd;
struct sockaddr_in cli_addr;
int sin_size;
sin_size=sizeof(struct sockaddr_in);
con_fd=accept(sockfd,(struct sockadd*)&cli_addr,&sin_size);//接受请求
if(con_fd<0)
{
printf("error in accepting \n\a");
close(sockfd);
return -1;
}
printf("client %s connect.......\n",inet_ntoa(*(struct sockaddr_in *)&cli_addr.sin_addr.s_addr));
char buf[MAXSIZE];
FILE *File;
int nsize;
File=fopen("temp","w");//打开一个文件用来保存传送的文件
if(File==NULL)
{
printf("error in creating conserve file %s \n\a",buf);
close(sockfd);
return -1;
}
else
printf("the file is stored in temp.....\n");
fflush(NULL);
while((nsize=recv(con_fd,buf,MAXSIZE,0))!=0)//接收文件
fwrite(buf,1,nsize,File);
close(sockfd);//关闭套接口
return 1;
};
int main()
{//启动测试
int sockfd;
sockfd=b_link(MYPORT);
if(b_access(sockfd)>0)
printf("file accept end \n\a");
else
printf("file accept failed \n\a");
return 1;
}
*********************************************************************************
客户端:传送文件
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<stdio.h>
#define MAXSIZE 8096
#define MYPORT 12000
int b_connect(char *hostname)//与主机建立连接,参数hostname为主机名或ip
{
int sockfd,ret,len;
struct sockaddr_in ser_addr;
char *myname;
struct hostent *sh;
struct in_addr *addrs;
if((sh=gethostbyname(hostname))==NULL)//将主机名转换成数字地址
{
if((sh=gethostbyaddr(hostname,4,AF_INET))==NULL)
{
printf("the host name couldn't be expressed \n\a");
return -1;
}
}
printf("connecting to %s ......\n",inet_ntoa(*(struct sockaddr *)sh->h_addr_list[0]));
addrs=(struct in_addr *)sh->h_addr_list[0];
sockfd=socket(AF_INET,SOCK_STREAM,0);//创建一个套接口
if(sockfd<0)
{
printf("error in building socket \n\a");
return -1;
}
ser_addr.sin_family=AF_INET;//协议ip/tcp
ser_addr.sin_port=htons(MYPORT);主机监听端口,转换成网络数字形式
memcpy(&(ser_addr.sin_addr.s_addr),addrs,sizeof(struct in_addr));//主机ip地址,网络数字形式
bzero(&(ser_addr.sin_zero), ;
ret=connect(sockfd,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr));//与主机建立连接
if(ret<0)
{
printf("error in conneting \n\a");
return -1;
}
return sockfd;
};
int f_send(int sockfd,char *fs)//文件传送 参数:sockfd 已经建立的套接口,fs传送的文件名(包括路径)
{
FILE *File;
int nsize;
int i=0;
char temp[MAXSIZE];
char buf[MAXSIZE];
File=fopen(fs,"r");//打开要传送的文件
if(File==NULL)
{
printf("file: %s open failed!.....\n",fs);
return -1;
}
while((nsize=fread(buf,1,MAXSIZE,File))>0)//读文件
{
send(sockfd,buf,nsize,0);//传送文件
}
if(feof(File)!=0)
printf("file transfers succussly!\n%d",strlen(buf));
else
printf("error in reading file \n\a");
fclose(File);
close(sockfd);
return 1;
};
int main(void)//测试
{
int sockfd;
char hostname[100];
char file[100];
printf("please input the hostname(ip) you want to connect:");
fflush(NULL);
gets(hostname);
sockfd=b_connect(hostname);
if(sockfd<=0)
return -1;
printf("connect success!\nplease input the filename you want to transfer:");
fflush(NULL);
gets(file);
return f_send(sockfd,file);
}
................................................................................................
这只能算是最简单的socket编程文件传送,没有判断出错等
当然大家可以改进
主机端的基本形式是:
socket 建立套接字
blind 绑定端口
listen 监听端口
accept 接受请求
recv 接受数据
close 关闭套接字
服务端的基本形式:
socket 建立套接字
connect 与主机端建立连接
send 传送数据
close 关闭套接字
等最近一段时间把社会调查完成了,再修改一下
要是有谁改进的了,就贴一下的了,大家共同探讨了 |
|