用标准C语言编写一个ftp协议上传文件的简单程序
如题所示,用标准C语言编写一个ftp协议上传文件的简单程序,请各位大虾指导,谢谢。
2008-01-10 22:48
2008-01-10 23:11
2008-01-10 23:33
2008-01-11 00:23

2008-01-11 12:41
2008-01-11 12:57
程序代码:#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib ")
#define SERVER_PORT 6666
#define BUFFERLEN 128
int main()
{
WORD wVersionRequested;
WSADATA wsadata;
int ret, nLength,length;
SOCKET sListen, sServer;
struct sockaddr_in saServer,saClient;
char tmpbuf[BUFFERLEN];
char *ptr;
//winsock初始化
wVersionRequested = MAKEWORD(2,2);
ret = WSAStartup(wVersionRequested,&wsadata);
if(ret != 0)
{
printf("WSAStartup() failed \n");
return 1;
}
//确认Winsock DLL支持2.2版本
if(LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
WSACleanup();
printf("Invalid winsock version \n");
return 2;
}
//创建Socket 使用TCP协议
sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
WSACleanup();
printf("socket failed \n");
return 3;
}
//构建本地地址信息
saServer.sin_family = AF_INET;
saServer.sin_port = htons(SERVER_PORT);
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//绑定
ret = bind(sListen,(struct sockaddr *)&saServer,sizeof(saServer));
if( ret == SOCKET_ERROR)
{
printf("bind() failed! error code: %d\n \n",WSAGetLastError());
closesocket(sListen);
WSACleanup();
return 4;
}
//侦听连接请求
ret = listen(sListen,5);
if( ret == SOCKET_ERROR)
{
printf("listem() failed! error code: %d\n \n",WSAGetLastError());
closesocket(sListen);
WSACleanup();
return 5;
}
printf("Waiting for client connecting !\n");
printf("Ctrl + C to quit \n");
//阻塞等待接受客户端连接
length = sizeof(saClient);
sServer = accept(sListen,(struct sockaddr *)&saClient, &length);
if(sServer == INVALID_SOCKET)
{
printf("accept() failed! error code : %d\n",WSAGetLastError());
closesocket(sListen);
WSACleanup();
return 6;
}
printf("Accepted client: %s:%d\n",
inet_ntoa(saClient.sin_addr),ntohs(saClient.sin_port));
while(1)
{
_strtime( tmpbuf );
//给客户端发送的数据
nLength = strlen(tmpbuf);
ptr = tmpbuf;
//发送数据
ret = send(sServer,ptr,nLength+1,0);
if(ret == SOCKET_ERROR)
{
printf("send() failederror code : %d\n",WSAGetLastError());
break;
}
printf("system time : %s\t\t\t\t %d byte sended\n",ptr,ret);
Sleep((DWORD)100);
}
closesocket(sListen);
WSACleanup();
puts("press Enter to exit!");
getchar();
return 0;
}客户端:
程序代码:#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib ")
#define SERVER_PORT 6666
#define BUFFERLEN 128
int main()
{
WORD wVersionRequested;
WSADATA wsadata;
int ret,i=0;
SOCKET sClient;
struct sockaddr_in saServer;
char tmpbuf[BUFFERLEN];
char *ptr = tmpbuf;
char strIP[20];
ULONG wIP;
char flag[4]={'\\','|','/','-'};
//winsock初始化
wVersionRequested = MAKEWORD(2,2);
ret = WSAStartup(wVersionRequested,&wsadata);
if(ret != 0)
{
printf("WSAStartup() failed \n");
return 1;
}
//确认Winsock DLL支持2.2版本
if(LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
WSACleanup();
printf("Invalid winsock version \n");
return 2;
}
//创建Socket 使用TCP协议
sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed \n");
return 3;
}
printf("Please input server's ip address : ");
scanf("%s",strIP);
//构建服务器地址信息
saServer.sin_family = AF_INET;
saServer.sin_port = htons(SERVER_PORT);
wIP = inet_addr(strIP);
if(wIP == -1)
{
printf("wrong ip address");
return -1;
}
saServer.sin_addr.S_un.S_addr = wIP;
//连接服务器
printf("connect to server ,please waitting...........\n");
ret = connect(sClient,(struct sockaddr *)&saServer, sizeof(saServer));
if(ret == SOCKET_ERROR)
{
printf("Can't connect server ,maybe server doesn't startup \n");
printf("waitting to try again ...........\\");
Sleep((DWORD)500);
}
while(ret == SOCKET_ERROR)
{
ret = connect(sClient,(struct sockaddr *)&saServer, sizeof(saServer));
if(ret == SOCKET_ERROR)
{
i++;
i=i%4;
printf("\b%c",flag[i]);
Sleep((DWORD)500);
}
}
//接受数据
while(1)
{
ret = recv(sClient,ptr,BUFFERLEN,0);
if(ret == SOCKET_ERROR)
{
printf("recv() failed \n");
break;
}
if(ret == 0)
{
printf("Server has closed the connection \n");
break;
}
printf("server time : %s\t\t\t\t %d byte received\n",ptr,ret);
}
closesocket(sClient);
WSACleanup();
puts("press Enter to exit!");
getchar();
return 0;
}

2008-01-11 13:06

2008-01-11 13:20

2008-01-11 13:27

2008-01-11 14:03