《socket网络间通信传送任意格式和大小的文件》.pdf
文本预览下载声明
/**************************************************************************************
修改 IP 地址和端口号,即可实现任意主机互联, 传送文件的大小和格式没有限制!
把服务器端保存为:socket_service.c 客户端:socket_client.c
编译时执行:
gcc -g socket_service.c -lpthread -o server
gcc -g socket_client.c -o client
在 server 端执行 : #./server
client 端执行: #./client ./baby.jpg MyBaby.jpg
或者: #./client Linux_driver.pdf MyFile.pdf
第一个参数是:client 要发送的文件, 第二个参数是 :server 要保存的文件名。
即可把 client 端当前目录下的 Linux_driver.pdf 发送给 server 端, 保存名为 Myfile.pdf, 路径可以自己定义。
但不能太长, 可以去修改 data.h 中的 struct data 中的 filename ,filesavename 。
由于 网络接口 MTU 的限制(一般 mtu 为 1500 ),大些的文件只能分多次发送,这样就有几个问题:
分几次发送?一次发送多大? 保存端的怎么保存?
这些问题在我的代码中都得到了解决, 而且 server 端采用了多线程处理, 理论上说,这是一个非常强悍的接
收端!
经过测试, 下面的代码没有严重的 bug, 一次性传送几个 M 的文件轻松愉快,而且各种反馈信息保证了调试 ,
修改非常容易!
欢迎大家给以批评指正!
All the code wirten by handawei @吉林师范大学
*************************************************************************************/
/*******socket_service.c***************************/
#include data.h
int sockid;
pthread_t tid;
int fileopen;
__sighandler_t f_quit(void)
{
printf(\nserver closed right now!!\n);
close(sockid);
close(fileopen);
exit(0);
}
struct thread_para{
int sockid;
struct sockaddr_in addr;
struct sockaddr_in fromaddr;
struct data datarecv;
};
int main(int argc,char* argv[])
{
signal(SIGINT,(__sighandler_t)f_quit);
struct thread_para thread_do;
memset(thread_do,0,sizeof(thread_do));
sockid = socket(AF_INET,SOCK_STREAM,0);
if(sockid == -1)
printf(socker create error!),exit(-1);
printf(sockid = %d\n,sockid);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
//inet_aton(192.168.10.50,addr.sin_addr);
addr.sin_addr.s_addr = INADDR_ANY;
int r = bind(sockid,(struct sockaddr*)addr,sizeof(addr));
if(r0)
printf(bind error!,r=%s\n,strerror(errno)),exit(
显示全部