zoukankan      html  css  js  c++  java
  • Windows网络编程:winsock文件传输范例

    基于TCP流协议的winsock网络文件传输Demo:

    实现:C语言
    功能:文件传输(可以传任何格式的文件)

    /*************************************************************************
    	> File Name: Win_Server.c
    	> Author: SongLee
    	> E-mail: lisong.shine@qq.com 
    	> Created Time: 2014年03月16日 星期日 19时43分44秒
        > Personal Blog: http://songlee24.github.io/
     ************************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <WinSock2.h>
    
    #define PORT 8087
    #define SERVER_IP "127.0.0.1"
    #define BUFFER_SIZE 1024
    #define FILE_NAME_MAX_SIZE 512
    #pragma comment(lib, "WS2_32")
    
    int main()
    {
    	// 声明并初始化一个服务端(本地)的地址结构
    	sockaddr_in server_addr;
    	server_addr.sin_family = AF_INET;
    	server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
    	server_addr.sin_port = htons(PORT);
    
    	// 初始化socket dll
    	WSADATA wsaData;
            WORD socketVersion = MAKEWORD(2, 0);
    	if(WSAStartup(socketVersion, &wsaData) != 0)
    	{
    		printf("Init socket dll error!");
    		exit(1);
    	}
    
    	// 创建socket
    	SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0);
            if (SOCKET_ERROR == m_Socket)
            {
    	        printf("Create Socket Error!");
    		exit(1);
            }
    
    	//绑定socket和服务端(本地)地址
    	if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
    	{
    		printf("Server Bind Failed: %d", WSAGetLastError());
    		exit(1);
    	}
    
    	//监听
    	if (SOCKET_ERROR == listen(m_Socket, 10))
    	{
    		printf("Server Listen Failed: %d", WSAGetLastError());
    		exit(1);
    	}
    
    
    	while(1)
    	{
    		printf("Listening To Client...
    ");
    
    		sockaddr_in client_addr;
    		int client_addr_len = sizeof(client_addr);
    
    		SOCKET m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len);
    		if (SOCKET_ERROR == m_New_Socket)
    		{
    			printf("Server Accept Failed: %d", WSAGetLastError());
    			break;
    		}
    
                    char buffer[BUFFER_SIZE];
                    memset(buffer, 0, BUFFER_SIZE);
    		if (recv(m_New_Socket, buffer, BUFFER_SIZE, 0) < 0)
    		{
    			printf("Server Receive Data Failed!");
    			break;
    		}
    
    		char file_name[FILE_NAME_MAX_SIZE+1];
    		memset(file_name, 0, FILE_NAME_MAX_SIZE+1);
    		strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));
                    printf("%s
    ", file_name);
    
    		FILE * fp = fopen(file_name, "rb");  //windows下是"rb",表示打开一个只读的二进制文件
    		if (NULL == fp)
    		{
    			printf("File: %s Not Found
    ", file_name);
    		}
                    else
    		{
    			memset(buffer, 0, BUFFER_SIZE);
    			int length = 0;
    
    			while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
    			{
    				if (send(m_New_Socket, buffer, length, 0) < 0)
    				{
    					printf("Send File: %s Failed
    ", file_name);
    					break;
    				}
    				memset(buffer, 0, BUFFER_SIZE);
    			}
    
    			fclose(fp);
    			printf("File: %s Transfer Successful!
    ", file_name);
    		}
    		closesocket(m_New_Socket);
    	}
    
    	closesocket(m_Socket);
    	//释放winsock库
    	WSACleanup();
    	return 0;
    }
    

    /*************************************************************************
    	> File Name: Win_Client.c
    	> Author: SongLee
    	> E-mail: lisong.shine@qq.com 
    	> Created Time: 2014年03月16日 星期日 20时12分10秒
        > Personal Blog: http://songlee24.github.io/
     ************************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <WinSock2.h>
    
    #define PORT 8087
    #define SERVER_IP "127.0.0.1"
    #define BUFFER_SIZE 1024
    #define FILE_NAME_MAX_SIZE 512
    #pragma comment(lib, "WS2_32")
    
    int main()
    {
    	// 初始化socket dll
    	WSADATA wsaData;
    	WORD socketVersion = MAKEWORD(2, 0);
    	if(WSAStartup(socketVersion, &wsaData) != 0)
    	{
    		printf("Init socket dll error!");
    		exit(1);
    	}
    
    	//创建socket
    	SOCKET c_Socket = socket(AF_INET, SOCK_STREAM, 0);
    	if (SOCKET_ERROR == c_Socket)
    	{
    		printf("Create Socket Error!");
    		system("pause");
    		exit(1);
    	}
    
    	//指定服务端的地址
    	sockaddr_in server_addr;
    	server_addr.sin_family = AF_INET;
    	server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
    	server_addr.sin_port = htons(PORT);
    
    	if (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
    	{
    		printf("Can Not Connect To Server IP!
    ");
    		system("pause");
    		exit(1);
    	}
    
    	//输入文件名
            char file_name[FILE_NAME_MAX_SIZE+1];
    	memset(file_name, 0, FILE_NAME_MAX_SIZE+1);
    	printf("Please Input File Name On Server: ");
    	scanf("%s", &file_name);
    
    	char buffer[BUFFER_SIZE];
    	memset(buffer, 0, BUFFER_SIZE);
    	strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE:strlen(file_name));
    
    	//向服务器发送文件名
    	if(send(c_Socket, buffer, BUFFER_SIZE, 0) < 0)
    	{
    		printf("Send File Name Failed
    ");
    		system("pause");
    		exit(1);
    	}
    
    	//打开文件,准备写入
    	FILE * fp = fopen(file_name, "wb"); //windows下是"wb",表示打开一个只写的二进制文件
    	if(NULL == fp)
    	{
    		printf("File: %s Can Not Open To Write
    ", file_name);
    		system("pause");
    		exit(1);
    	}
    	else
    	{
    		memset(buffer, 0, BUFFER_SIZE);
    		int length = 0;
    		while ((length = recv(c_Socket, buffer, BUFFER_SIZE, 0)) > 0)
    		{
    			if (fwrite(buffer, sizeof(char), length, fp) < length)
    			{
    				printf("File: %s Write Failed
    ", file_name);
    				break;
    			}
    			memset(buffer, 0, BUFFER_SIZE);
    		}
    
    		printf("Receive File: %s From Server Successful!
    ", file_name);
    	}
    
    	fclose(fp);
    	closesocket(c_Socket);
    	
    	//释放winsock库
    	WSACleanup();
    
    	system("pause");
    	return 0;
    }
    


  • 相关阅读:
    【洛谷习题】公路修建
    priority_queue用法简记
    【洛谷习题】无线通讯网
    【SCOI2005】繁忙的都市
    第四周 3.20-3.26
    第三周 3.13-3.19
    第二周 3.6-3.12
    第一周 2.28-3.5
    第六周 2.21-2.27
    2018湘潭邀请赛 AFK题解 其他待补...
  • 原文地址:https://www.cnblogs.com/songlee/p/5738160.html
Copyright © 2011-2022 走看看