免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 14620 | 回复: 35
打印 上一主题 下一主题

发个简单的TCP传送文件的例子 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-23 11:25 |只看该作者 |倒序浏览
特点(优缺点都有):
(1):windows 和 linux 通用。
(2):单线程发送接收
(3):阻塞方式socket。
(4):二进制读写
编译方法:
linux下我写了个makefile,直接make就行,windows下写了个简单bat,有鼠标直接双击就行,如果显示器支持触摸,食指双击也行
声明:
不能作为工程用(因为质量可能太差),只能拿来参考或者学习后者交流,有什么问题大家积极提出,回帖修改。
用exe,jpeg, rar, doc文件都测试了,没问题。用60多兆的鬼吹灯mp3测试了下,几秒钟,还行。
期望高人加入多线程多连接传输等。
贴一下client和server的代码,完整例子在附件中
=====================客户端===========
///client.c by cme

#include <stdio.h>
#include "tcp_sock.h"
int main(int argc, char* argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;unsigned short server_port = 2008;
&nbsp;&nbsp;&nbsp;&nbsp;int nSock = 0;
&nbsp;&nbsp;&nbsp;&nbsp;int fd = 0;
&nbsp;&nbsp;&nbsp;&nbsp;int nSend = 0;
&nbsp;&nbsp;&nbsp;&nbsp;int nBytes;
&nbsp;&nbsp;&nbsp;&nbsp;char szBuff[8192] = {0};
&nbsp;&nbsp;&nbsp;&nbsp;//struct sockaddr_in addr;

&nbsp;&nbsp;&nbsp;&nbsp;if(argc != 3)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("usage:%s destip  filename [port = 2008]\n", argv[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system("pause");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(strlen(argv[2]) > 128)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("file name to long\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;if((fd = _open(argv[2], O_RDONLY | _O_BINARY)) <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;#else
&nbsp;&nbsp;&nbsp;&nbsp;if((fd = open(argv[2], O_RDONLY)) <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("open file %s fail\n", argv[2]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;init_network();
&nbsp;&nbsp;&nbsp;&nbsp;nSock = tcp_connect(argv[1], server_port);
&nbsp;&nbsp;&nbsp;&nbsp;if(nSock <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("connect to server %s error\n", argv[1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;printf("connecting to %s success......\n", argv[1]);
&nbsp;&nbsp;&nbsp;&nbsp;if(send(nSock, argv[2], strlen(argv[2]), 0) <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("send file name %s fail\n", argv[2]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcp_close(nSock);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_close(fd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;while((nBytes = _read(fd, szBuff, 8192) ) > 0)
&nbsp;&nbsp;&nbsp;&nbsp;#else
&nbsp;&nbsp;&nbsp;&nbsp;while((nBytes = read(fd, szBuff, 8192) ) > 0)
&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(send(nSock, szBuff, nBytes, 0) <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szBuff, '\0', 8192);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;_close(fd);
&nbsp;&nbsp;&nbsp;&nbsp;#else
&nbsp;&nbsp;&nbsp;&nbsp;close(fd);
&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;tcp_close(nSock);
&nbsp;&nbsp;&nbsp;&nbsp;printf("sending file %s over\n", argv[2]);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


=================服务端====================
///server.c by cme

#include <stdio.h>
#include "tcp_sock.h"
int main(int argc, char* argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;unsigned short server_port = 2008;
&nbsp;&nbsp;&nbsp;&nbsp;int nSock = 0;
&nbsp;&nbsp;&nbsp;&nbsp;int nRead = 0;
&nbsp;&nbsp;&nbsp;&nbsp;init_network();
&nbsp;&nbsp;&nbsp;&nbsp;nSock = tcp_listen_port(server_port);
&nbsp;&nbsp;&nbsp;&nbsp;if(nSock <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("tcp listen on prot %d error\n", server_port);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_in addr;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szFile[128] = {0};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szBuff[8192] = {0};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int fd = -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nRead = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int len = sizeof(struct sockaddr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int new_sock = accept(nSock, (struct sockaddr*)&(addr), &len);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(new_sock <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1000);
#else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
#endif
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("one client connected\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((nRead = recv(new_sock, szFile, 128, 0)) <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcp_close(new_sock);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szFile + nRead, '\0', 128 - nRead);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(szFile, ".recv");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((fd = _open(szFile, O_WRONLY|O_CREAT|O_TRUNC | O_BINARY, 0644)) <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((fd = open(szFile, O_WRONLY|O_CREAT|O_TRUNC, 0644)) <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("open file %s fail\n", szFile);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcp_close(new_sock);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((nRead = recv(new_sock, szBuff, 8192, 0)) > 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_write(fd, szBuff, nRead);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(fd, szBuff, nRead);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(szBuff, 0, 8192);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef _WIN32
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_close(fd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("file %s transmit over......\n", szFile);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcp_close(new_sock);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

斗胆在linux版块贴个windows下的bat编译脚本


  1. echo "starting to complie files........."
  2. pause
  3. cl -c -D_WIN32 client.c  /WX
  4. cl -c -D_WIN32 tcp_sock.c  /WX
  5. cl -c -D_WIN32 server.c  /WX
  6. link /OUT:client.exe client.obj tcp_sock.obj
  7. link /OUT:server.exe server.obj tcp_sock.obj
  8. del *.obj
  9. pause
复制代码

[ 本帖最后由 duanjigang 于 2008-9-23 11:36 编辑 ]

tcp_file.rar

2.73 KB, 下载次数: 670

论坛徽章:
0
2 [报告]
发表于 2008-09-23 11:28 |只看该作者
代码在哪儿?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2008-09-23 11:28 |只看该作者
多谢版主的奉献精神,赞一个

论坛徽章:
0
4 [报告]
发表于 2008-09-23 11:30 |只看该作者
原帖由 cugb_cat 于 2008-9-23 11:28 发表
代码在哪儿?

上来了,表急。。。

论坛徽章:
0
5 [报告]
发表于 2008-09-23 11:33 |只看该作者
原帖由 Godbach 于 2008-9-23 11:28 发表
多谢版主的奉献精神,赞一个

最近申请转正,发贴太少,赶紧搜索磁盘,找点东西多回帖啊

论坛徽章:
0
6 [报告]
发表于 2008-09-23 12:04 |只看该作者
谢谢分享,学习ing

论坛徽章:
0
7 [报告]
发表于 2008-09-23 12:35 |只看该作者
赞楼主~
不过 tcp_sock.h头文件没贴出来

论坛徽章:
0
8 [报告]
发表于 2008-09-23 12:39 |只看该作者
谢谢楼主:)
在rar中看到头文件了。呵呵

论坛徽章:
0
9 [报告]
发表于 2008-09-23 13:38 |只看该作者
謝謝LZ分享。。。

论坛徽章:
0
10 [报告]
发表于 2008-09-23 13:49 |只看该作者
还是通用的~~收藏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP