请大家帮小弟我看一个socket传文件丢失信息的有关问题
请大家帮我看一个socket传文件丢失信息的问题。
初学socket,很多地方都不懂。
昨天写了个程序,传文件的时候发送接收都在本机没有问题,放在局域网传,文件就
接收的不完整了,怎么想不通,希望大家能给点指点!!
代码如下
发送端:
#include <Winsock2.h>
#include <stdio.h>
//连接一个库文件project-> setting-> link:object/library modules添加:ws2_32.lib
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//加载套接字库,加裁失败则返回
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}//如果不是1.1的则退出
SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);
bind(sockServer,(SOCKADDR *)&addrServer,sizeof(SOCKADDR));//绑定
listen(sockServer,5);//监听
SOCKADDR_IN sockClient;
int IClientSockLen=sizeof(SOCKADDR);
while(1){
SOCKET sockConn;
sockConn=accept(sockServer,(SOCKADDR *)&sockClient,&IClientSockLen);
FILE *fp;
if((fp=fopen( "111.exe ", "rb "))==NULL)//打开111.exe这个文件
{
printf( "FILE ERROR! ");
getchar();
return;
}
// send(sockConn,filename,strlen(filename),0);
printf( "初始化……\n ");
/* int Cmdtmp;
char Cmd=0;
Cmdtmp=send(sockConn,&Cmd,1,0);
while(Cmdtmp <1)
Cmdtmp=send(sockConn,&Cmd,1,0);
*/
getchar();
printf( "正在发送…… ");
char temp[1024];
while(!feof(fp)){
memset(temp,0,1024);
fread(temp,1024,1,fp);//读文件
int y = send(sockConn,temp,1024,0);
while(y <1024)
{
printf( "发送%d字节,不符合要求,重新发送\n ",y);
y=send(sockConn,temp,1024,0); //传送文件
}
}//while(feof)
fclose(fp);
closesocket(sockConn);
printf( "\n发送成功\n ");
}//while
}//main
接收端:
#include <Winsock2.h>
#include <stdio.h>
//连接一个库文件project-> setting-> link:object/library modules添加:ws2_32.lib
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//加载套接字库,加裁失败则返回
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}//如果不是1.1的则退出
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrClient;
初学socket,很多地方都不懂。
昨天写了个程序,传文件的时候发送接收都在本机没有问题,放在局域网传,文件就
接收的不完整了,怎么想不通,希望大家能给点指点!!
代码如下
发送端:
#include <Winsock2.h>
#include <stdio.h>
//连接一个库文件project-> setting-> link:object/library modules添加:ws2_32.lib
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//加载套接字库,加裁失败则返回
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}//如果不是1.1的则退出
SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);
bind(sockServer,(SOCKADDR *)&addrServer,sizeof(SOCKADDR));//绑定
listen(sockServer,5);//监听
SOCKADDR_IN sockClient;
int IClientSockLen=sizeof(SOCKADDR);
while(1){
SOCKET sockConn;
sockConn=accept(sockServer,(SOCKADDR *)&sockClient,&IClientSockLen);
FILE *fp;
if((fp=fopen( "111.exe ", "rb "))==NULL)//打开111.exe这个文件
{
printf( "FILE ERROR! ");
getchar();
return;
}
// send(sockConn,filename,strlen(filename),0);
printf( "初始化……\n ");
/* int Cmdtmp;
char Cmd=0;
Cmdtmp=send(sockConn,&Cmd,1,0);
while(Cmdtmp <1)
Cmdtmp=send(sockConn,&Cmd,1,0);
*/
getchar();
printf( "正在发送…… ");
char temp[1024];
while(!feof(fp)){
memset(temp,0,1024);
fread(temp,1024,1,fp);//读文件
int y = send(sockConn,temp,1024,0);
while(y <1024)
{
printf( "发送%d字节,不符合要求,重新发送\n ",y);
y=send(sockConn,temp,1024,0); //传送文件
}
}//while(feof)
fclose(fp);
closesocket(sockConn);
printf( "\n发送成功\n ");
}//while
}//main
接收端:
#include <Winsock2.h>
#include <stdio.h>
//连接一个库文件project-> setting-> link:object/library modules添加:ws2_32.lib
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//加载套接字库,加裁失败则返回
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}//如果不是1.1的则退出
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrClient;