?? long.cpp
字號:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <string.h>
#include <windows.h>
#include <process.h>
#include <winbase.h>
#pragma comment(lib,"ws2_32.lib")
#define BUFLEN 10000
int flag,nRC;
char s_ip[20];
char sendBuf[BUFLEN], recvBuf[BUFLEN];
void receive(SOCKET Sock)
{ nRC = recv(Sock, recvBuf, BUFLEN, 0);
recvBuf[nRC] ='\0';
printf("\n%s\n", recvBuf);
}
void communicate(SOCKET Sock,char *info)
{
strcpy(sendBuf,info);
send(Sock, sendBuf, strlen(sendBuf), 0);
nRC = recv(Sock, recvBuf, BUFLEN, 0);
recvBuf[nRC] ='\0';
printf("\n%s\n", recvBuf);
}
int transfer(int digit)
{ int i, j, m, n;
i = digit-1;
j = 1;
m = n = 0;
while((recvBuf[i--] != ')'));
while(recvBuf[i] != ',') {
m += (recvBuf[i] - 48) * j;
--i;
j *= 10;
}
i--;
j = 1;
while(recvBuf[i] != ',') {
n += (recvBuf[i] - 48) * j;
--i;
j *= 10;
}
return(n * 256 + m);
}
SOCKET createSock()
{ SOCKET newSock;
sockaddr_in clientAddr;
newSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(newSock == INVALID_SOCKET) {
printf("Client create socket error!\n");
WSACleanup();
return newSock;
}
printf("Socket create OK!\n");
clientAddr.sin_family = AF_INET;
clientAddr.sin_port = htons(0);
clientAddr.sin_addr.S_un.S_addr = INADDR_ANY;
/*表示不確定地址*/
nRC = bind(newSock,(LPSOCKADDR)&clientAddr,sizeof(clientAddr));
if(nRC == SOCKET_ERROR) {
printf("Socket bind error!\n");
closesocket(newSock);
WSACleanup();
flag=-1;
return newSock;
}
printf("Socket bind ok!\n");
return newSock;
}
int connectServer(SOCKET newSock, int portnumber)
{ sockaddr_in srvAddr;
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(portnumber);
/*hton把主機字節順序轉化為網絡字節順序,用于短整形數據*/
srvAddr.sin_addr.S_un.S_addr = inet_addr(s_ip);
nRC = connect(newSock,(LPSOCKADDR)&srvAddr,sizeof(srvAddr));
if(nRC == SOCKET_ERROR) {
printf("Connect to server error!\n");
closesocket(newSock);
WSACleanup();
return -1;
}
return 0;
}
void LIST(SOCKET clientSock)
{ int portnumber;
SOCKET dataSock;
dataSock = createSock();
if(flag == -1) return;
communicate(clientSock,"TYPE I\r\n");
communicate(clientSock,"PASV\r\n");
portnumber = transfer(nRC);
nRC = connectServer(dataSock, portnumber);
if(nRC == -1) return;
communicate(clientSock,"LIST -al\r\n");
receive(dataSock); /*文件列表*/
receive(clientSock); /*226 transfer complete*/
closesocket(dataSock);
}
void CWD(SOCKET clientSock)
{ char directory[25];
printf("input the directory:");
scanf("%s", directory);
strcpy(sendBuf, "CWD ");
strcat(sendBuf, directory);
strcat(sendBuf, "\r\n");
communicate(clientSock,sendBuf);
communicate(clientSock,"PWD\r\n");
}
void CDUP(SOCKET clientSock)
{ communicate(clientSock,"CDUP\r\n");
communicate(clientSock,"PWD\r\n");
LIST(clientSock);
}
void RETR(SOCKET clientSock)
{ int portnumber;
char fileName[25];
SOCKET dataSock;
FILE * fp;
dataSock = createSock();
if(flag == -1) return;
communicate(clientSock,"TYPE I\r\n");
communicate(clientSock,"PASV\r\n"); /*返回服務器端口號的信息*/
portnumber = transfer(nRC);
nRC = connectServer(dataSock, portnumber);
if(nRC == -1) return;
printf("input file's name:");
scanf("%s", fileName);
strcpy(sendBuf, "RETR ");
strcat(sendBuf, fileName);
strcat(sendBuf, "\r\n");
communicate(clientSock,sendBuf);
if(nRC == SOCKET_ERROR) {
printf("recieve error!\n");
closesocket(dataSock);
WSACleanup();
return;
}
fp = fopen(fileName, "w+b");
if(!fp) {
printf("recieve file create error!\n");
closesocket(dataSock);
return;
}
fseek(fp, 0, SEEK_SET);
while(1)
{ nRC = recv(dataSock, recvBuf, BUFLEN, 0);
if(nRC == 0){
fclose(fp);
break;
}else if(nRC > 0){
fwrite(recvBuf, sizeof(char), nRC, fp);
}
}
receive(clientSock);
closesocket(dataSock);
}
void STOR(SOCKET clientSock)
{ char fileName[25];
int amount, portnumber;
SOCKET dataSock;
FILE * fp;
dataSock = createSock();
if(flag == -1) return;
communicate(clientSock,"TYPE I\r\n");
communicate(clientSock,"PASV\r\n");
portnumber = transfer(nRC);
nRC = connectServer(dataSock, portnumber);
if(nRC == -1) return;
printf("input file's name:");
scanf("%s", fileName);
strcpy(sendBuf, "STOR ");
strcat(sendBuf, fileName);
strcat(sendBuf, "\r\n");
communicate(clientSock,sendBuf);
if(nRC == SOCKET_ERROR) {
printf("send error!\n");
closesocket(dataSock);
WSACleanup();
return;
}
fp = fopen(fileName, "r+b");
if(!fp) {
printf("send file open error!\n");
closesocket(dataSock);
return;
}
fseek(fp, 0, SEEK_SET);
while(1)
{ amount = fread(sendBuf, sizeof(char), BUFLEN, fp);
nRC = send(dataSock, sendBuf, amount, 0);
if(amount < BUFLEN) break;
}
closesocket(dataSock);
}
void main()
{ WSADATA wsaData;
int i,portnumber;
SOCKET clientSock;
char buf[30],s_port[5];
printf("input server's ip address:");
scanf("%s",s_ip);
printf("and the portnumber:");
scanf("%s",s_port);
nRC = WSAStartup(0x0101,&wsaData);
if(nRC){
printf("Client initialize winsock error!\n");
return;
}
if(wsaData.wVersion != 0x0101){
printf("Client winsock version error!\n");
WSACleanup();
return;
}
printf("Client's winsock initialized!\n");
clientSock = createSock();
if(flag == -1) return;
portnumber=atoi(s_port);
nRC = connectServer(clientSock, portnumber);
if(nRC == -1) return;
/*接受服務器發來的數據(220,...ready)*/
receive(clientSock);
printf("input user's name:");
scanf("%s", buf);
strcpy(sendBuf, "USER ");
strcat(sendBuf, buf);
strcat(sendBuf, "\r\n");
communicate(clientSock,sendBuf);
printf("input password:");
scanf("%s", buf);
strcpy(sendBuf, "PASS ");
strcat(sendBuf, buf);
strcat(sendBuf, "\r\n");
communicate(clientSock,sendBuf);
communicate(clientSock,"PWD\r\n"); /*顯示當前路徑*/
while(1) {
printf("-------------------------------------------------\n");
printf("1.LIST 2.CWD 3.CDUP 4.RETR 5.STOR 6.QUIT\n");
printf("choose:");
scanf("%d",&i);
switch (i) {
case 1: {
LIST(clientSock);
break;
}
case 2: {
CWD(clientSock);
break;
}
case 3: {
CDUP(clientSock);
break;
}
case 4: {
RETR(clientSock);
break;
}
case 5: {
STOR(clientSock);
receive(clientSock);
break;
}
case 6: {
closesocket(clientSock);
WSACleanup();
return;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -