服务器:
#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 20int 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 20int 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中是空的没有值。
那里有问题呢?

解决方案 »

  1.   

    fp=fopen("e:/test.txt","wb");
    或者
    fp=fopen("e:\\test.txt","wb");
    服务器端断点调试下吧
      

  2.   

    test.txt建立成功了,但是数据没有写进去。
    relen=recv(newsock,buf,1024,0); 
    这里没收到是怎么回事,relen是0?
      

  3.   

    你试试在客户端closesocket退出程序之前,Sleep一下再看看你的服务器端能recv到数据吗?
      

  4.   

    原始数据有多大啊?
    relen为0  errno是多少啊?
      

  5.   

    我也是建议在接收或者有数据收到的时候
    Sleep(1000);
    一下,或许会有用。
      

  6.   

    relen=recv(newsock,buf,1024,0);
    Sleep(1000);text.txt都没了
      

  7.   

    忘改路径了
    relen=recv(newsock,buf,1024,0);
    Sleep(1000);这样还是不对啊。。
      

  8.   

    服务端
    if (relen==0)
     
    {
     
    break;
     
    }改成 if (relen <= 0)
    {
    break;
    }
    不然退不出去循环
      

  9.   

    发现问题了,接收的部分判断出出错了。
    改下就好
    while(1)//循环接收client发来的数据
    {
    relen=recv(newsock,buf,1024,0);
    fwrite(buf,1,relen,fp);
    // printf("接受了一次!\n");
    fflush(fp); if (relen==0)
    {
    break;
    }
    printf("接受了%d次!\n",relen);
    }
      

  10.   


    #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
    #define FILENAME 200
    #define BUFFER 1024int main(void)
    { WSADATA wsadata;//这个结构被用来存储 被WSAStartup函数调用后返回的windows数据
    WSAStartup(MAKEWORD(2,0),&wsadata);//WSAStarup,是Windows SocKNDs Asynchronous的启动命令申请2.0版本的套接字
    SOCKET sock_trans=socket(AF_INET,SOCK_STREAM,0); if (INVALID_SOCKET==sock_trans ||SOCKET_ERROR==sock_trans)
    {
    perror("socket");
    printf("socket error!!!\n");
    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","w+");//此处以后应当先接受文件名。之后打开文件,接受客户端的数据写文件。
    if(fp==NULL)
    {
    perror("open file:");
    exit(4);
    } if (bind(sock_trans,(SOCKADDR*)(&saddr),sadlen)==SOCKET_ERROR)
    { 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"); int saddrlen=sizeof(saddr); SOCKET newsock=accept(sock_trans,(SOCKADDR*)&saddr,&saddrlen); printf ("catch file now....\n");
    char buf[BUFFER]={0};
    ZeroMemory(buf,1024); int relen=0;//recv接收到的字节
    /*
    ********************************************************************************
    1.n>0,正常读取n个字节
    2.n==0,socket对方节点正常shutdown   
    3.n==-1,未能正常读取数据,根据值不同errno被置为几种情况
    ********************************************************************************
    */ Sleep(3000); while(1)//循环接收client发来的数据
    {
    relen=recv(newsock,buf,1024,0);
    fwrite(buf,1,relen,fp);
    // printf("接受了一次!\n");
    fflush(fp); if (relen==0)
    {
    break;
    }
    printf("接受了%d次!\n",relen);
    } fclose(fp); closesocket(newsock);
    closesocket(sock_trans);
    WSACleanup(); system("pause"); return 0;}