#include <io.h>
#include <winsock2.h>
#include <fcntl.h>
#include <sys\stat.h>
int recv_file(SOCKET sock)
{
char buffer[1024] = {0};
int name_len;
/*首先讀取sizeof(int) 即4個字節的內容,服務器發送文件名之前會把該文件名的長度發送過來*/
if (recv(sock,(char *)&name_len,sizeof(int),0) < 0)
{
printf("遠程服務器斷開");
return -1;
}
/*接收即將傳輸文件的文件名*/
if (recv(sock,buffer,name_len,0))
{
printf("遠程服務器斷開");
return -1;
}
/*創建該文件,最好此處加上判斷,該文件是否已經存在*/
int fd = open(buffer,O_RDWR|O_CREAT ,S_IFMT );
if (fd < 0)
{
printf("文件創建失敗\n");
return -1;
}
int recv_count = 0;
/*從套接字循環讀取文件內容*/
while ((recv_count = recv(sock,buffer,sizeof(1024),0))>0)
{
/*將讀取到的內容保存至文件,recv_count為從網絡上讀取到得字節數,然後原數保存至文件*/
write(fd,buffer,recv_count);
}
printf("文件接收完成,成功保存至當前目錄下\n");
return 0;
}
void main()
{
WSADATA wsa_data;
/*windows 下使用sock 必須調用這個函數,0x0202是壹個版本號*/
WSAStartup(0x0202,&wsa_data); SOCKET s_sock;
/*創建套接字*/
s_sock = socket(AF_INET,SOCK_STREAM,0); /*定義本機綁定套接字需要的IPV4地址*/
sockaddr_in se_addr;
se_addr.sin_family = AF_INET;
se_addr.sin_port = htons(1024);/*指定端口號1024*/
se_addr.sin_addr.S_un.S_addr = INADDR_ANY;/*綁定本機任意網卡IP*/ /*將前兩步創建的套接字和IP地址綁定*/
bind(s_sock,(sockaddr*)&se_addr,sizeof(sockaddr)); /*開始啟動監聽服務*/
if (listen(s_sock,10)<0)
{
int err = GetLastError();
}
sockaddr_in from_addr;
int addr_len = sizeof(from_addr);
/*等待發送文件服務器連接,此為阻塞函數*/
SOCKET temp_sock = accept(s_sock,(sockaddr *)&from_addr,&addr_len); /*有服務器連接到本機,調用接收文件函數*/
recv_file(temp_sock);
} 文件發送端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>
#include <io.h>
#include <winsock2.h>
#include <fcntl.h>
#include <sys\stat.h>
int send_file(SOCKET sock,char *name)
{
int fd = open(name,O_RDWR ,S_IFMT );
if (fd < 0)
{
printf("文件打開失敗\n");
return -1;
} int name_len = strlen(name);
/*首先發送文件名的長度*/
send(sock,(char *)&name_len,sizeof(int),0);
/*發送文件名*/
send(sock,name,name_len,0);
char buffer[1024] = {0};
int read_count = 0;
/*循環從文件中讀取,然後寫入到套接字,發送到網絡*/
while ((read_count = read(fd,buffer,sizeof(1024)))>0)
{
send(sock,buffer,read_count,0);
}
printf("文件發送完成\n");
return 0;
}
void main(int argc,char *argv[])
{
WSADATA wsa_data;
WSAStartup(0x0202,&wsa_data);
SOCKET s_sock;
s_sock = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in to_addr;
to_addr.sin_family = AF_INET;
to_addr.sin_port = htons(1024);
/*指定接收文件IP為本機(127.0.0.1為本機IP),如其他主機請更改此IP,正常來說,IP應寫入配置文件*/
to_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
char file_name[256] = {0};
printf("請輸入要發送的文件名,並確保該文件存在於當前目錄下\n");
scanf("%s",file_name); /*連接接收文件的電腦*/
if (connect(s_sock,(sockaddr *)&to_addr,sizeof(sockaddr)) < 0)
{
printf("鏈接接受文件電腦失敗\n");
return;
} /*調用發送文件函數*/
send_file(s_sock,file_name);
}