读书人

tcp文件传输的有关问题

发布时间: 2013-01-25 15:55:29 作者: rapoo

tcp文件传输的问题




服务器:
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>

#pragma comment(lib,"ws2_32.lib")

#define PORT 6666
#define IPADDR "127.0.0.1"
#define BACKLOG 20

int main(void)
{

WSADATA wsadata;
WSAStartup(MAKEWORD(2,0),&wsadata);

unsigned sock_trans=socket(AF_INET,SOCK_STREAM,0);

if (sock_trans<0)

{

perror("socket");
exit(1);

}

SOCKADDR_IN saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(PORT);
saddr.sin_addr.S_un.S_addr=inet_addr(IPADDR);

int sadlen=sizeof(saddr);

FILE* fp=NULL;
fp=fopen("e://test.txt","wb");
if(fp==NULL)
{

perror("open file:");
exit(4);
}

if (bind(sock_trans,(SOCKADDR*)(&saddr),sadlen)==SOCKET_ERROR)

//printf ("%d\n",vbind);

{

perror("bind:");
exit(2);

}
else printf ("bind port ok!\n");

//int vlisten=50;

if (listen(sock_trans,20)==SOCKET_ERROR)

{
perror("listen");
exit(3);
}

else
printf ("now listenning.....\n");

//printf ("%d",listen(sock_trans,20));

int saddrlen=sizeof(saddr);

unsigned newsock=accept(sock_trans,(SOCKADDR*)&saddr,&saddrlen);

printf ("catch file now....");
char *buf=(char*)malloc(1024);
ZeroMemory(buf,1024);

int relen=0;

//测试程序的酱油语句,无视之。

//recv(newsock,buf,50,0);

// printf ("%s",buf);

// printf ("\nif put this line ,the program is error!");

while(1)

{

relen=recv(newsock,buf,1024,0);

fwrite(buf,1,relen,fp);

//ZeroMemory(buf,50);

if (relen==0)

{

break;

}

}

fclose(fp);

closesocket(newsock);
closesocket(sock_trans);
WSACleanup();

return 0;

}

客户端:
#include <stdio.h>
#include <windows.h>
//#include <winsock2.h>
#include <stdlib.h>


#pragma comment(lib, "ws2_32.lib")

int main(int argc, char *argv[])

{

FILE *fp;

printf("file name:");

char filename[50]={0};

gets(filename);

fp=fopen(filename,"rb");

if (fp==NULL)

{

perror("\nopen file error:");

exit(1);

}

WSADATA wsadata;

WSAStartup(MAKEWORD(2,0),&wsadata);

unsigned sock_trans=socket(AF_INET,SOCK_STREAM,0);

if (sock_trans==0)
{

printf ("socket build faile!!\n");
exit(1);

}

printf ("target pc's IP address:\n");

//如果正式调试,将服务器端ip写死。

char *ipaddr=NULL;

ipaddr=(char *)malloc(128);

gets(ipaddr);

SOCKADDR_IN sockadd;

sockadd.sin_family=AF_INET;

sockadd.sin_port=htons(6666);

sockadd.sin_addr.S_un.S_addr=inet_addr(ipaddr);

int con_info=connect(sock_trans,(SOCKADDR*)&sockadd,

sizeof(sockadd));

if (con_info==SOCKET_ERROR)
{

printf ("connect fail!\n");

//exit(2);

}

char *buf=(char*)malloc(50);


int freed_return_val=0;

while (feof(fp))

{

freed_return_val=fread(buf,1,50,fp);
send(sock_trans,buf,freed_return_val,0);

}

fclose(fp);

closesocket(sock_trans);
WSACleanup();

return 0;

}



服务器:
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>

#pragma comment(lib,"ws2_32.lib")

#define PORT 6666
#define IPADDR "127.0.0.1"
#define BACKLOG 20

int main(void)
{

WSADATA wsadata;
WSAStartup(MAKEWORD(2,0),&wsadata);

unsigned sock_trans=socket(AF_INET,SOCK_STREAM,0);

if (sock_trans<0)

{

perror("socket");
exit(1);

}

SOCKADDR_IN saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(PORT);
saddr.sin_addr.S_un.S_addr=inet_addr(IPADDR);

int sadlen=sizeof(saddr);

FILE* fp=NULL;
fp=fopen("e://test.txt","wb");
if(fp==NULL)
{

perror("open file:");
exit(4);
}

if (bind(sock_trans,(SOCKADDR*)(&saddr),sadlen)==SOCKET_ERROR)

//printf ("%d\n",vbind);

{

perror("bind:");
exit(2);

}
else printf ("bind port ok!\n");

//int vlisten=50;

if (listen(sock_trans,20)==SOCKET_ERROR)

{
perror("listen");
exit(3);
}

else
printf ("now listenning.....\n");

//printf ("%d",listen(sock_trans,20));

int saddrlen=sizeof(saddr);

unsigned newsock=accept(sock_trans,(SOCKADDR*)&saddr,&saddrlen);

printf ("catch file now....");
char *buf=(char*)malloc(1024);
ZeroMemory(buf,1024);

int relen=0;

//测试程序的酱油语句,无视之。

//recv(newsock,buf,50,0);

// printf ("%s",buf);

// printf ("\nif put this line ,the program is error!");

while(1)

{

relen=recv(newsock,buf,1024,0);

fwrite(buf,1,relen,fp);

//ZeroMemory(buf,50);

if (relen==0)

{

break;

}

}

fclose(fp);

closesocket(newsock);
closesocket(sock_trans);
WSACleanup();

return 0;

}

客户端:
#include <stdio.h>
#include <windows.h>
//#include <winsock2.h>
#include <stdlib.h>


#pragma comment(lib, "ws2_32.lib")

int main(int argc, char *argv[])

{

FILE *fp;

printf("file name:");

char filename[50]={0};

gets(filename);

fp=fopen(filename,"rb");

if (fp==NULL)

{

perror("\nopen file error:");

exit(1);

}

WSADATA wsadata;

WSAStartup(MAKEWORD(2,0),&wsadata);

unsigned sock_trans=socket(AF_INET,SOCK_STREAM,0);

if (sock_trans==0)
{

printf ("socket build faile!!\n");
exit(1);

}

printf ("target pc's IP address:\n");

//如果正式调试,将服务器端ip写死。

char *ipaddr=NULL;

ipaddr=(char *)malloc(128);

gets(ipaddr);

SOCKADDR_IN sockadd;

sockadd.sin_family=AF_INET;

sockadd.sin_port=htons(6666);

sockadd.sin_addr.S_un.S_addr=inet_addr(ipaddr);


int con_info=connect(sock_trans,(SOCKADDR*)&sockadd,

sizeof(sockadd));

if (con_info==SOCKET_ERROR)
{

printf ("connect fail!\n");

//exit(2);

}

char *buf=(char*)malloc(50);

int freed_return_val=0;

while (feof(fp))

{

freed_return_val=fread(buf,1,50,fp);
send(sock_trans,buf,freed_return_val,0);

}

fclose(fp);

closesocket(sock_trans);
WSACleanup();

return 0;

}




启动服务器,后启动客户端输入文件名e:\q.txt。。
然后text.txt中是空的没有值。
那里有问题呢?
[解决办法]
fp=fopen("e:/test.txt","wb");
或者
fp=fopen("e:\\test.txt","wb");


服务器端断点调试下吧


[解决办法]
你试试在客户端closesocket退出程序之前,Sleep一下再看看你的服务器端能recv到数据吗?
[解决办法]
引用:
引用:fp=fopen("e:/test.txt","wb");
或者
fp=fopen("e:\\test.txt","wb");


服务器端断点调试下吧
test.txt建立成功了,但是数据没有写进去。
relen=recv(newsock,buf,1024,0);
这里没收到是怎么回事,relen是0?
……

原始数据有多大啊?
relen为0 errno是多少啊?
[解决办法]
我也是建议在接收或者有数据收到的时候
Sleep(1000);
一下,或许会有用。
[解决办法]
服务端
if (relen==0)

{

break;

}改成

if (relen <= 0)
{
break;
}
不然退不出去循环

读书人网 >VC/MFC

热点推荐