1. 程式人生 > >Socket程式設計實現檔案的傳輸

Socket程式設計實現檔案的傳輸

客戶端執行方式:
./a.out src
其中src代表要進行傳輸的原始檔,目標檔案會在伺服器端自動生成一個檔案,並將客戶端傳送過來的src檔案內容全部寫入到伺服器所建立的檔案中;可以通過md5sum +檔名 的方式來檢視src檔案和伺服器端中生成的檔案的內容是否相等;

客戶端:

/*************************************************************************
    * File Name: client.c
    * Author:    The answer
    * Function:  Other        
    * Mail:      
[email protected]
* Created Time: 2017年06月15日 星期四 18時54分22秒 ************************************************************************/
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<fcntl.h> #include<sys/types.h> #include<sys/stat.h> #include<sys/socket.h>
#include<arpa/inet.h> #include<netinet/in.h> #include<errno.h> #define MAXSIZE 4096 #define IP "127.0.0.1" #define SERV_PORT 8000 void sys_err(const char *ptr,int num) { perror(ptr); exit(num); } int main(int argc,char **argv) { // ./a.out src int sockfd; char buf[MAXSIZE]; struct
sockaddr_in addr; //建立socket套接字 sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd < 0) sys_err("socket",-1); bzero(&addr,sizeof(addr)); //初始化ip+port addr.sin_family = AF_INET; addr.sin_port = htons(SERV_PORT); addr.sin_addr.s_addr = inet_addr(IP); //connect將sockfd套接字描述符與伺服器端的ip+port聯絡起來 if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)) < 0) sys_err("connect",-2); //開啟讀的檔案 const char *src = argv[1]; int fd = open(src,O_RDONLY); if(fd < 0) sys_err("open",-3); while(1) { int len = read(fd,buf,sizeof(buf)); if(len == 0) break; int _tmp = 0; //考慮若socket緩衝區小於len的情況,見原理圖1 while(1) { int ret = write(sockfd,buf + _tmp, len - _tmp); if(ret > 0 ) _tmp += ret; if(_tmp == ret) break; if(ret < 0) { perror("write"); break; } } } close(sockfd); return 0; }

這裡寫圖片描述

                         圖1

服務端:

/*************************************************************************
 * File Name: server.c
 * Author:    The answer
 * Function:  Other        
 * Mail:      [email protected] 
 * Created Time: 2017年06月15日 星期四 17時02分26秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/socket.h>
#include<signal.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
#include<string.h>
#define SERV_PORT 8000

//封裝出錯函式
void sys_err(const char *ptr,int num)
{
    perror(ptr);
    exit(num);
}

int main(int argc,char **argv)
{
    signal(SIGPIPE,SIG_IGN);
    int sockfd,accefd;
    struct sockaddr_in seraddr,cliaddr;
    socklen_t len;

    bzero(&seraddr,sizeof(seraddr));
    bzero(&cliaddr,sizeof(cliaddr));

    //socket
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        sys_err("socket",-1);
    }

    //初始化ip地址+port埠號
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(SERV_PORT);
    seraddr.sin_addr.s_addr = htonl(INADDR_ANY);

    //bind
    if(bind(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)
    {
        sys_err("bind",-2);
    }

    //listen
    if(listen(sockfd,128) < 0 )
    {
        sys_err("listen",-3);
    }
    //accept
    while(1)
    {
        char buf[4096];
        len = sizeof(cliaddr);
        accefd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
        if(accefd < 0)
        {
            if(errno == EINTR)  //判斷阻塞等待客戶端的連結;是被訊號打斷還是其它因素
                continue;
            else
                sys_err("accept",-4);
        }
        //開始檔案的讀寫操作
        memset(buf,0x00,sizeof(buf));
        int filefd = open("copy.txt",O_WRONLY |O_CREAT |O_TRUNC,0777);
        while(1)
        {
            if(filefd < 0)
                sys_err("open",-5);

            int leng = read(accefd,buf,sizeof(buf));
            if(leng == 0)
            {
                printf("Opposite have close the socket.\n"); 
                break; //表示檔案已經讀到了結尾,也意味著客戶端關閉了socket
            }
            if(leng == -1 && errno == EINTR)
                continue;
            if(leng == -1 )
                break; //表示出現了嚴重的錯誤
            write(filefd,buf,leng);

        }

        //若檔案的讀寫已經結束,則關閉檔案描述符
        close(filefd);
        close(accefd);
    }
    close(sockfd);
    return 0;
}

相關推薦

Socket程式設計實現檔案傳輸

客戶端執行方式: ./a.out src 其中src代表要進行傳輸的原始檔,目標檔案會在伺服器端自動生成一個檔案,並將客戶端傳送過來的src檔案內容全部寫入到伺服器所建立的檔案中;可以通過md5sum +檔名 的方式來檢視src檔案和伺服器端中生成的檔案的內

Socket程式設計------TCP檔案傳輸(文件、聲音、圖片、視訊和壓縮包等)

本程式是基於TCP穩定傳輸的檔案傳輸,可以相容任何型別任何格式的檔案傳輸。 ☆基本思路(客戶端) 客戶端需要明確伺服器的ip地址以及埠,這樣才可以去試著建立連線,如果連線失敗,會出現異常。 連線成功,說明客戶端與服務端建立了通道,那麼通過IO流就可以進行資料的傳輸,而So

Java Socket通訊實現檔案傳輸/圖片傳輸

Scoket傳送 ClientTcpSend.java: import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.InetS

【C/C++學院】(29)網路程式設計--實現跨平臺傳輸檔案(TCP版)

    為了實現跨平臺,需要對跨平臺的程式碼進行條件編譯。 gcc的-D選項。 連線選項 -lWs2_32 代表要用Ws2_32.lib這個庫 gcc編譯選項,-D 代表定義一個巨集,等同於在c語言當中定義 #defind WIN 在windows下,使用socket之

Python通過Socket實現檔案傳輸

客戶端# -*- coding: utf-8 -*- import socket import argparse import os import hashlib import pickle def parse_args(): parser = argparse.A

Java UDP實現檔案傳輸

編寫基於TCP/IP網路利用UDP通訊的二進位制檔案傳輸程式,傳輸到指定對端後要存檔。 利用FileStreams類實現檔案傳輸。 程式存放格式: Receive_Thread.java package UDP_File; import java.io.File; import

socket程式設計--實現簡單的qq

socket程式設計–實現簡單的qq 單向通訊 伺服器端: /** * 這是伺服器端,讓它在9999埠監聽 */ package Test1netServer; import java.net.*; import java.io.*

Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊

Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊 置頂 2017年06月23日 14:44:37 閱讀數:3225 標籤: socket程式設計伺服器與多個客戶端通epoll多路複用C語言網路程式設計 更多

**c++基於tcp協議的socket程式設計實現一個簡單伺服器**

c++基於tcp協議的socket程式設計實現一個簡單伺服器 基於tcp的通訊,可以利益socket套接字實現。通訊,顧名思義需要伺服器和客戶端兩者進行資訊互動。 通過流程圖我們可以看到程式設計實現伺服器和客戶端的步驟大致相同,而伺服器則更為複雜一些。本文之給出了一個簡單的伺服器程式設計和

本地電腦與遠端伺服器之間如何方便的實現檔案傳輸

對於企業辦公使用者或高校實驗室童鞋而言,經常需要在個人膝上型電腦或桌上型電腦上寫程式碼或寫文件,對於程式碼執行資源要求高的程式碼,可能還要放到實驗室的伺服器上執行。這就涉及到內網本機與遠端伺服器之間的檔案傳輸問題。實現方法有很多種,在此簡單介紹使用方便的兩種: 1、使用xftp工具

Linux下用UDP實現檔案傳輸

UDP程式設計框圖                                           UDP協議中伺服器和客戶端的互動存在於資料的收發過程中。         進行網路資料收發的時候,伺服器和客戶端的資料是對應的:客戶端傳送資料的動作,對伺服器來說是接

NIO結合Socket程式設計實現

基本概念 Socket又稱“套接字”,應用程式通過“套接字”向網路發出請求或者應答網路請求。Socket和SocketServer類庫位於java.net包中,ServerSocket用於伺服器端,Socket是建立網路連結使用的。在連線成功時,應用程式兩端會產

windows下 Libevent +多執行緒 實現檔案傳輸

1、模式:來一個客戶端連線進來,服務端就開啟一個處理執行緒。 2、缺點:對大量的客戶端情況不適用。大量客戶端的情況需要加入執行緒管理機制。 // LibeventTest.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #incl

遠端桌面與本地桌面實現檔案傳輸

解決本地和遠端主機檔案複製貼上問題 在程序裡開啟rdpclip.exe程序即可在本地與伺服器間自由複製貼上; Remote Desktop Protocol 遠端桌面協議,rdpclip遠端桌面剪貼簿。 向遠端主機共享碟符 執行mstsc(Microsoft Telnet Screen Cont

windows與Linux實現檔案傳輸Winscp工具的使用

WinSCP是一個Windows環境下使用SSH的開源圖形化SFTP客戶端。同時支援SCP協議。它的主要功能就是在本地與遠端計算機間安全的複製檔案。.winscp也可以連結其他系統,比如linux系統 Winscp最大的特性是圖形化介面,能夠實現像windows一樣的拖拽功能,同時支援批量處理檔案和命令列.

golang 實現檔案傳輸小demo

    獲取檔案資訊需要用到os. Stat介面,傳送檔案前開啟接收者(服務端),啟動客戶端先發送檔名給接收者,接收者收到檔名返回確認資訊"ok",才讀取本地檔案 傳送給接收者。 傳送者: package main import ( "fmt" "io

Springboot2(25)整合netty實現檔案傳輸

原始碼地址 springboot2教程系列 其它netty檔案有部落格 Springboot2(24)整合netty實現http服務(類似SpingMvc的contoller層實現) Springboot2(25)整合netty實現檔案傳輸 Springb

java-基本的Socket程式設計-實現伺服器端和客戶端通訊

基本的Socket程式設計: 本例項介紹Socket程式設計的基本步驟。啟動Socket服務後,再開啟Socket刻畫段,在輸入框中輸入訊息,然後傳送給伺服器端,伺服器端將收到的訊息返回到客戶端。 關鍵技術: Socket程式設計的關鍵技術如下; —–S

程式設計實現檔案拷貝

package com.java.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; impor

【樹莓派】配置樹莓派,實現檔案傳輸

安裝作業系統 進到後選擇: RASPBIAN STRETCH WITH DESKTOP是圖形介面,RASPBIAN STRETCH LITE是命令列介面,一般下載RASPBIAN STR