1. 程式人生 > >socket簡單檔案傳輸例項

socket簡單檔案傳輸例項

今天在linux系統上寫了一個簡單的socket檔案傳輸的例子,共享出來僅供參考。例子很簡單,只要初學者瞭解簡單的幾個socket相關函式和檔案函式就能寫的出來。

伺服器端程式:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>

#define BUF_SIZE      1024
#define SERVER_PORT   1234

int main()
{
char *filename = "sendfile.txt";
FILE *fp = fopen(filename,"rb" );
if(fp == NULL )
{
printf("open file error!!\r\n");
exit(1);
}
else
{
printf("open file succeed\r\n");
}

int server_sockfd = socket(AF_INET,SOCK_STREAM,0);
///bind listen
struct sockaddr_in server_sockAddr;
memset(&server_sockAddr,0 , sizeof(server_sockAddr));
server_sockAddr.sin_family = PF_INET;
server_sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
server_sockAddr.sin_port = htons(SERVER_PORT);

if(bind(server_sockfd,(struct sockaddr *)&server_sockAddr,\
sizeof(server_sockAddr) ) == -1)
{
perror("bind error\r\n");
exit(1);
}

if(listen(server_sockfd,20) == -1)
{
perror("listen error\r\n");
exit(1);
}

///accept
struct sockaddr_in client_addr;
int clnSize = sizeof(client_addr);
int conn = accept(server_sockfd,(struct sockaddr*)&client_addr,&clnSize);
if(conn <0)
{
perror("accept error!\r\n");
exit(1);
}

/// 迴圈傳送檔案直到末尾;
char buffer[BUF_SIZE]={0};
int send_len = 0;
while((send_len = fread(buffer,1, BUF_SIZE,fp)) >0)
{
    send(conn, buffer, send_len, 0);
}
shutdown( conn, SHUT_WR);
recv(conn,buffer,BUF_SIZE, 0);

fclose(fp);
close(conn);
close(server_sockfd);

return 0;
}

客戶端程式:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>


int main()
{
///手動輸入建立你檔案
char filename[100]; //儲存檔名
printf("input the file name: ");
gets(filename);
//scanf("Input file name to save:%s ", filename);
FILE *fp = fopen(filename, "wb");
if(fp == NULL){
printf("open file failed!!\r\n");
exit(1);
}

//定義客戶端socketfd
int sock_cli = socket(PF_INET,SOCK_STREAM, IPPROTO_TCP);

//connect
struct sockaddr_in serveraddr;
serveraddr.sin_family = PF_INET;
serveraddr.sin_port = htons(1234);
serveraddr.sin_addr.s_addr =inet_addr("127.0.0.1");

if (connect(sock_cli,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) <0)
{
	perror("connect failed!\r\n");
	exit(1);
}
int ncount = 0;
char recvbuf[1024] = {0};
while( (ncount = recv(sock_cli, recvbuf, 1024, 0)) >0) {
    
fwrite(recvbuf, 1, ncount, fp);
}

puts("file transfer succeed!!\r\n");
memset(recvbuf, 0, 1024);
fclose(fp);
close(sock_cli);
return 0;
}

然後呢我們在linux命令列下對這兩個檔案分別編譯,別說你不會編譯的命令哈。

先執行伺服器端的程式


再執行客戶端的程式:


完了後你會發現當前目錄下多了一個你在客戶端手動建立的檔案,檔案內容與伺服器端傳送過來的檔案內容一致!

總結下:其實呢,socket的檔案傳輸和socket一般的字串通訊差不多的,將檔案的內容讀出來傳送到對端而已。

相關推薦

socket簡單檔案傳輸例項

今天在linux系統上寫了一個簡單的socket檔案傳輸的例子,共享出來僅供參考。例子很簡單,只要初學者瞭解簡單的幾個socket相關函式和檔案函式就能寫的出來。 伺服器端程式: #inclu

TFTP服務[精簡版]:簡單檔案傳輸協議

      簡單檔案傳輸協議(Trivial File Transfer Protocol,TFTP)是一種基於 UDP 協議在客戶端 和伺服器之間進行簡單檔案傳輸的協議。顧名思義,它提供不復雜、開銷不大的檔案傳輸服 務(可將其當作 FTP 協議的簡化版本)。    TFTP 的命令功能不如 FTP 服務

Java Socket程式設計 檔案傳輸(客戶端從伺服器下載一個檔案

用於客戶端從伺服器端下載檔案 伺服器(Server) package com.socket.sample; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.i

基於TCP的TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議) 的c程式設計實現

我們或許都聽到過,TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議)是TCP/IP協議族中的一個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,提供不復雜、開銷不大的檔案傳輸服務。 本文就簡單的敘述下tftp的小檔案傳輸功能以及客戶端

Python通過Socket實現檔案傳輸

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

基於Socket檔案傳輸(使用CSocket類)

本軟體使用MFC採用面向物件的方法實現了基於Socket的檔案傳輸。這是原來研究生課程的結課作業,實現了Socket的傳送和接收,以及讀取ini配置檔案等操作。使用了CSocket類 以下是當時結課作業 的正文: 一.軟體特點如下: 1.採用了多執行緒的方法,

C語言基於socket檔案傳輸(可迴圈傳送多個檔案)

基本簡介:本次檔案傳輸的實現主要是通過客戶端向伺服器傳送下載請求,然後在伺服器中找到對應的檔案並開啟檔案,再繼續向客戶端傳送檔案,而客戶端就在不停的接收。這是因為檔案可能比較大,一個緩衝陣列只能儲存一部分檔案內容,因此伺服器得不斷從檔案中讀取內容併發給客戶端,而客戶端得不停的

qemu-kvm虛擬機器與宿主機之間簡單檔案傳輸方法

 qemu-kvm虛擬機器與宿主機之間實現檔案傳輸,大概兩類方法: 1. 虛擬機器與宿主機之間,使用網路來進行檔案傳輸。這個需要先在宿主機上配置網路橋架,在qemu-kvm啟動配置網絡卡就可以實現檔案傳輸。 2. 使用9psetup協議實現虛擬機器與宿主機之間檔案傳輸。

使用socket tcp實現簡單檔案傳輸

程式分為server、client兩個部分,client從server獲取檔案。流程如下: server: 1、建立socket,繫結埠10002,等待client連線; 2、連結後開啟需要傳送的檔案,計算檔案長度併發送長度,等待接收客戶端響應; 3、客戶端響應ok後,傳送檔案資料,傳送

python基於併發與socket實現遠端檔案傳輸程式

FTP程式 Client: * bin/start.py 程式入口 * conf/配置檔案存放 * core/ * auth.py 登陸,註冊以及上傳下載檢視當前資料夾下檔案以及刪除功能存放 * cline.py 與服務端通訊 * home 本地使用者目錄 Server: * bin/

一個簡單的python檔案傳輸伺服器

伺服器 程式碼,可以相容python2 和 python3 #!/usr/bin/python3 # -*- coding: utf-8 -*- from socket import socket, AF_INET, SOCK_STREAM class SimpleServer:  

基於socket簡單的TCP下載和傳輸

客戶端: import socket def main(): tcp_custom=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sev_ip=input('shu ru ip:') sev_port=input('shu ru

C#實戰027:socket實現大檔案傳輸

前面寫了一個單檔案傳輸的,後來發現當傳送的檔案大於設定的快取空間時,檔案就會出現丟包的現象,導致檔案無法使用,所以為了適應大檔案的傳輸,這裡我將程式碼進行了下修改,實現大檔案傳輸。 不過socket實現大檔案傳輸有個缺點,由於傳輸過程是通過位元組快取傳送,接受也是讀寫位元組,導致整個傳輸過

C#實戰026:socket實現單檔案傳輸

    實現簡單的資訊通訊,接下來我們要繼續來是實現檔案的傳輸,同樣這次先試試單個簡單的小檔案傳輸,首先先說說原理,這次我們先對檔案進行檔名獲取,將檔名以資訊傳輸的形式的先傳遞給服務端,目的是讓伺服器知道我們要傳送的檔名及檔案型別,接著再來發送檔案,這裡我們需要將檔案轉化成位元組

簡單檔案傳輸

package main import ( "net" "fmt" "log" "time" "os" "bufio" "flag" "strconv" ) func writeFile(path string,write* bufio.Writ

C#.網路程式設計 Socket基礎(三) 基於WinForm系統Socket TCP協議 實現端到端(伺服器與客戶端).txt.word.png等不同型別檔案傳輸

一、簡介: 前面的兩篇介紹了字串傳輸、圖片傳輸: 其實,本文針對Socket基礎(二)進一步完成,以便可以進行多種檔案傳輸。 二、基於不同的流(檔案流、記憶體流、網路等)讀寫。 1、圖片傳輸 方法一:(在客戶端用檔案流傳送(即將圖片寫到檔案流去,以便傳送),

C#.網路程式設計 Socket基礎(四) WPF系統Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸,同時解決UI執行緒與工作執行緒的卡頓問題

一、簡介 雖然,本文的前面幾篇文章在WinForm中實現了Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸,詳情見 但是,卻沒有在WPF中實現 Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸。因此,本文將描述如何在WPF中實現該功能。

windows環境下的socket程式設計(tcp檔案傳輸的實現)

開發環境 使用codeclock軟體進行程式設計 新建專案選擇console application完成相應的步驟即可。在專案下有main.c的檔案只需要將程式碼寫入其中即可。 程式碼設計 客戶端 client #include <std

udp socket: 簡單的資料包與視訊流傳輸

簡單的包傳輸 客戶端向服務端傳送資料包,服務端打印出來。 我們來傳送一首詩吧,柳永的《雨霖鈴》 服務端: #include <stdio.h> #include <sys/socket.h> #include <sys/

android WIFI Socket 檔案傳輸——問題已經解決了,發帖只因高興--嘿嘿--並不徹底歡迎點評

</pre><pre name="code" class="java">我的這個Socket是想保持一個長連線,檔案可以迴圈傳輸 但是我的問題在於,不能抓住檔案傳輸完成的這個時機,導致異常 我的檔案傳送程式碼 [code=java] publ