Linux C++ TCP Socket传输文件或图片实例

环境:Linux

语言:C++

通信方式:TCP

  下面用TCP协议编写一个简单的服务器、客户端,其中服务器端一直监听本机的6666号端口。如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接。连接建立成功后,读取文件内容(/root/workspace/socket-picture/bizhi.jpg),发送给服务器端,服务器端新建new1.jpg文件,将接收到的文件内容保存到new1.jpg中,new1.jpg在当前目录下;

Server.cpp

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<errno.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<unistd.h>
 9
10 #define MAXLINE 4096
11
12 int main(int argc, char** argv){
13     int  listenfd, connfd;
14     struct sockaddr_in  servaddr;
15     char  buff[4096];
16     FILE *fp;
17     int  n;
18
19     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
20         printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
21         return 0;
22     }
23     printf("----init socket----\n");
24
25     memset(&servaddr, 0, sizeof(servaddr));
26     servaddr.sin_family = AF_INET;
27     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
28     servaddr.sin_port = htons(6666);
29     //设置端口可重用
30     int contain;
31     setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &contain, sizeof(int));
32
33     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
34         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
35         return 0;
36     }
37     printf("----bind sucess----\n");
38
39     if( listen(listenfd, 10) == -1){
40         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
41         return 0;
42     }
43     if((fp = fopen("new1.jpg","ab") ) == NULL )
44     {
45         printf("File.\n");
46         close(listenfd);
47         exit(1);
48     }
49
50     printf("======waiting for client‘s request======\n");
51     while(1){
52         struct sockaddr_in client_addr;
53         socklen_t size=sizeof(client_addr);
54         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &size)) == -1){
55             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
56             continue;
57         }
58         while(1){
59             n = read(connfd, buff, MAXLINE);
60             if(n == 0)
61                 break;
62             fwrite(buff, 1, n, fp);
63         }
64         buff[n] = ‘\0‘;
65         printf("recv msg from client: %s\n", buff);
66         close(connfd);
67         fclose(fp);
68     }
69     close(listenfd);
70     return 0;
71 }

Client.cpp

 1 #include <stdio.h>
 2 #include <errno.h>
 3 #include <string.h>
 4 #include <netdb.h>
 5 #include <sys/types.h>
 6 #include <netinet/in.h>
 7 #include <sys/socket.h>
 8 #include <stdlib.h>
 9 #include <unistd.h>
10 #include <arpa/inet.h>
11 #include <netdb.h>
12 #define MAXLINE 4096
13
14 int main(int argc, char** argv){
15     int   sockfd, len;
16     char  buffer[MAXLINE];
17     struct sockaddr_in  servaddr;
18     FILE *fq;
19
20     if( argc != 2){
21         printf("usage: ./client <ipaddress>\n");
22         return 0;
23     }
24
25     if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
26         printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
27         return 0;
28     }
29
30     memset(&servaddr, 0, sizeof(servaddr));
31     servaddr.sin_family = AF_INET;
32     servaddr.sin_port = htons(6666);
33     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
34         printf("inet_pton error for %s\n",argv[1]);
35         return 0;
36     }
37
38     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
39         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
40         return 0;
41     }
42     if( ( fq = fopen("/root/workspace/socket-picture/bizhi.jpg","rb") ) == NULL ){
43         printf("File open.\n");
44         close(sockfd);
45         exit(1);
46     }
47
48     bzero(buffer,sizeof(buffer));
49     while(!feof(fq)){
50         len = fread(buffer, 1, sizeof(buffer), fq);
51         if(len != write(sockfd, buffer, len)){
52             printf("write.\n");
53             break;
54         }
55     }
56     close(sockfd);
57     fclose(fq);
58
59     return 0;
60 }

makefile

 1 all:server client
 2 server:server.o
 3     g++ -g -o server server.o
 4 client:client.o
 5     g++ -g -o client client.o
 6 server.o:server.cpp
 7     g++ -g -c server.cpp
 8 client.o:client.cpp
 9     g++ -g -c client.cpp
10 clean:all
11     rm all

   执行make命令后,生成server和client两个可执行文件。分别打开两个终端窗口,一个执行./server命令,一个执行./client 127.0.0.1命令,表示连上本机的6666端口,执行./server命令的要先执行。执行./client 127.0.0.1命令后,client客户端执行完毕直接退出,这时可以看到server的那个终端窗口输出“recv msg from client:”。打开当前目录(指的是可执行文件server所在的目录),可看到new1.jpg文件已经生成,双击打开,文件内容没有丢失。

原文地址:https://www.cnblogs.com/zkfopen/p/9441797.html

时间: 2024-10-06 15:00:11

Linux C++ TCP Socket传输文件或图片实例的相关文章

Java使用Socket传输文件遇到的问题(转)

1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决了问题. 个人认为可能是传输过程中,接收端向磁盘写速度有点慢,被后面的覆盖导致错误. //---------------------------------------------------------------------------------------------------------

securecrt在linux与windows之间传输文件(转)

摘自:http://blog.csdn.net/rangf/article/details/6096365 SecureCRT这款SSH客户端软件同时具备了终端仿真器和文件传输功能.比ftp命令方便多了,而且服务器不用再开FTP服务了.rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. windows端需要支持ZModem的telnet/ssh客户端,SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可).

Linux系统远程服务器传输文件

本篇文章内容介绍本地计算机与linux远程服务器之间传输文件 本地计算机与linux远程服务器之间传输文件 准备 1.一台远程服务器(需要登录的账号和密码) 2.一台能正常连上互联网的本地计算机 3.下载安装xftp软件 xftp软件下载地址https://www.netsarang.com/zh/xftp/ 打开xftp软件 新建会话 点击确定,连接,就可以把本地文件上传到服务器中了 原文地址:https://www.cnblogs.com/tigertank/p/11612672.html

Linux scp 免密码 传输文件

Linux scp 免密码 传输文件 背景介绍 最近项目是集群化部署(由 node1,node2,node3 三台 CentOS 7.4 的虚拟机构成). 但是,涉及到跨机器同步文件的问题,想通过写shell文件实现,用 crontab 设置定时任务,定时执行改脚本. 由于每次都需要输入密码,导致定时任务没法正常工作,因此,需要三台机器之间可以免密码互相访问. 建立SSH的信任关系 以实现 node1 免密码给 node2 scp传输文件为例说明,需要如下几个步骤: 1.生成 node1 的秘钥

Android手机间使用socket进行文件互传实例

这是一个Android手机间文件传输的例子,两个手机同时装上此app,然后输入接收端的ip,选择文件,可以多选,点确定,就发送到另一个手机,一个简单快捷文件快传实例.可以直接运用到项目中. 下面是文件选择器: 代码 首先加入文件选择库 compile 'com.nononsenseapps:filepicker:2.5.2' 这个库的地址和用法在:https://github.com/spacecowboy/NoNonsense-FilePicker activity_main.xml <Rel

Python Socket传输文件

发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一: #-*- coding: UTF-8 -*- import socket,time,SocketServer,struct,os,thread host='192.168.50.74' port=12307 s=socket.socket(socket.AF_INET,socket.SOCK_S

Python tcp socket 传送文件

[测试环境] os:Windows 10 x64 Python:3.6.3 [server.py] #encoding: utf-8 #author: walker #date:  2017-12-01  #summary: 用socket创建tcp server以接收文件  import os, time import socket import struct cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__)) Host 

Linux C++ TCP Socket通信实例

环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服务器端建立连接并发送一条消息. server.cpp 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<errno.h> 5 #include<sys/type

Linux SCP命令复制传输文件的用法

SCP命令是用户通过网络将一台Linux服务器的文件复制到另一台Linux服务器,方法如下: 一:从本地复制到远程 复制文件: 命令格式: scp local_file [email protected]_ip:remote_folder 例子: scp /home/space/music/1.mp3 [email protected]:/home/root/others/music scp /home/space/music/1.mp3 [email protected]:/home/root