服务器:
#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中是空的没有值。
那里有问题呢?
或者
fp=fopen("e:\\test.txt","wb");
服务器端断点调试下吧
relen=recv(newsock,buf,1024,0);
这里没收到是怎么回事,relen是0?
relen为0 errno是多少啊?
Sleep(1000);
一下,或许会有用。
Sleep(1000);text.txt都没了
relen=recv(newsock,buf,1024,0);
Sleep(1000);这样还是不对啊。。
if (relen==0)
{
break;
}改成 if (relen <= 0)
{
break;
}
不然退不出去循环
改下就好
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);
}
#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;}