功能:分为客户端和服务器,client可向server传送字符串,传送文件。

环境:Ubuntu
编译方法: server.c: gcc  –o server server.c
client.c:  gcc -o client client.c
运行方法:打开两个终端,先在一个终端运行./ server,然后在另一个终端运行 ./client。
源码:
server.c
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<sys/socket.h>#include<sys/stat.h>#include<arpa/inet.h>#define MAXBUF 256#define PORT 7787int main(){int clen;int ssock,csock;struct sockaddr_in client_addr,server_addr;//客户端,服务器地址char buf[MAXBUF+5], name[MAXBUF+5];//两个缓冲区
FILE *fp;if((ssock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)/*  AF_UNIX表示只能够用于单一的Unix 系统进程间通信,SOCK_STREAM表明用的是TCP 协议成功时返回文件描述符,失败时返回-1*/{perror("socket error:");exit(1);}clen = sizeof(client_addr);memset(&server_addr,0,sizeof(server_addr));/*将已开辟的server_addr的前sizeof(server_addr)个字节设置为0 */server_addr.sin_family     =AF_INET;/*sin_family指代协议族,在socket编程中只能是AF_INET*/server_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*INADDR_ANY表示可以和任何的主机通信*/server_addr.sin_port=htons(PORT);/*sin_port存储端口号*/if(bind(ssock,(struct sockaddr *)&server_addr,sizeof(server_addr))<0){/*  使用bind进行绑定端口: bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败返回-1*/perror("bind error");exit(1);}if(listen(ssock,8)<0){/*  listen(bind后的文件描述符,最大请求排队长度)listen函数将bind的文件描述符变为监听套接字,成功返回0,否则返回-1*/perror("listen error:");exit(1);}csock=accept(ssock,(struct sockaddr *)&client_addr,(socklen_t*)&clen);/*  accept(int sockfd, struct sockaddr *addr,int *addrlen)addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了失败时返回-1*/while(1){if(recv(csock,buf, MAXBUF,MSG_WAITALL)>0)//MSG_WAITALL表示没有读到指定字节数之前不返回
{if(strcmp(buf,"@#$%")==0){//表示要传文件
recv(csock,buf,MAXBUF,MSG_WAITALL);//接收文件名
sprintf(name,"%s1",buf);//将buf格式化为长字符串型,赋给nameif((freopen(name,"w",stdout))!=NULL){//以写方式打开文件while(recv(csock,buf,MAXBUF,MSG_WAITALL)>0)//接收文件内容
{if(strcmp(buf,"@#$%")==0)break;//收到@#$%表示已经传送完毕
fwrite(buf,sizeof(char),strlen(buf),stdout);//写入文件
}fclose(stdout);freopen("/dev/tty","w",stdout);//
puts("File received success!");}}else if(strcmp(buf,"%$#@")==0){//表示传字符
recv(csock,buf,MAXBUF,MSG_WAITALL);//接收传来的字符
printf("%s\n",buf);send(csock,"Server receive message success!",MAXBUF,0);//返回确认信息
}}}close(csock);return 0;}

client.c
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/socket.h>#include<sys/stat.h>#include<arpa/inet.h>#include<string.h>#define MAXBUF 256#define PORT 7787int main(){int ssock;int clen, ch;char buf[MAXBUF+5];//缓冲区struct sockaddr_in server_addr;if((ssock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0){// 建立socket,使用因特网,TCP流传输
perror("socket error:");exit(1);}clen = sizeof(server_addr);memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family     =AF_INET;server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//inet_addr:ip转换为4字节整形,使用时需要根据服务端ip进行更改
server_addr.sin_port =htons(PORT);if(connect(ssock,(struct sockaddr *)&server_addr,clen)<0){/*  客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小,connect函数是客户端用来同服务端连接的.成功时返回0, 失败返回-1*/perror("connect error:");exit(1);}while(1){printf("1: Send Message\n2: Send File\n3: Exit [1/2/3]?");scanf("%d",&ch);if(ch==1){//Send Message
scanf("%s",buf);send(ssock,"%$#@",MAXBUF,0);//告诉服务器要传字符串
send(ssock, buf, MAXBUF,0);//发送要传的字符
recv(ssock, buf, MAXBUF,MSG_WAITALL);//接收确认信息
puts(buf);}else if(ch==2){//Send File
printf("input the filename: ");scanf("%s",buf);if(freopen(buf, "r",stdin)!=NULL){send(ssock,"@#$%",MAXBUF,0);//告诉服务器要传文件
send(ssock,buf,MAXBUF,0);//传文件名int cnt=0;while((ch=getchar())!=EOF){buf[cnt++]=ch;//buf缓冲区大小为MAXBUF,也就是每读MAXBUF个字符,传送一次if(cnt==MAXBUF){buf[cnt]=0,cnt=0;send(ssock,buf,MAXBUF,0);}}if(cnt){buf[cnt]=0,cnt=0;send(ssock,buf,MAXBUF,0);}//传送最后不足MAXBUF的部分
send(ssock,"@#$%",MAXBUF,0);//表示传送完毕
fclose(stdin);freopen("/dev/tty","r",stdin);}}else break;}close(ssock);return 0;}

转载于:https://www.cnblogs.com/myblog-lyc/p/4164997.html

socket编程-客户端向服务器发送字符串,传文件相关推荐

  1. Android Socket编程android端服务器和客户端的实现

     Android Socket编程android端服务器和客户端的实现       其实和java实现的差不多,或本质是用java实现的,但由于android有自身的独特性,所以还是有一些要注意的点: ...

  2. C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)

    前言 这几天加紧赶工写服务器端的程序,所有系列文章更新较慢,见谅: ) 注意 本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心.实现以及其他能够贴 ...

  3. Java服务端向客户端写文件_java实现客户端向服务器发送文件

    本文实例为大家分享了java实现客户端向服务器发送文件的具体代码,供大家参考,具体内容如下 服务器源代码: import java.io.BufferedReader; import java.io. ...

  4. qt客户端显示服务器发送的图片,qt客户端显示服务器发送的图片

    qt客户端显示服务器发送的图片 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. ...

  5. c++ Socket实现客户端与服务器数据传输

    c++ Socket实现客户端与服务器数据传输 这是自己第二次写博客,希望在博客记录自己的学习过程,欢迎大家评论! 实现: 客户端往服务器端发送一条数据,服务器端接收数据并输出; 服务器端再发送出接收 ...

  6. java服务端无法发送给客户端,无法从客户端向服务器发送消息

    我正在开发一个应用程序,我需要从客户端向服务器发送消息,并在客户端上的文件发生更改时通知服务器 . 我在Qt中使用QTcpServer和QTcpSocket类 . 我正在写socket并从服务器端的s ...

  7. qt客户端显示服务器发送的图片,c++ - Qt客户端服务器应用程序“发送图像”出现问题 - 堆栈内存溢出...

    我正在尝试通过QDataStream从客户端向服务器发送图像( OpenCV Mat ). 第一项是int,即缓冲区的大小. 它可以处理10到15张图片,然后服务器读取第一个int随机数(通常〜2 ^ ...

  8. 把客户端文件发送到服务器,客户端向服务器发送文件

    客户端向服务器发送文件 内容精选 换一换 Microsoft SQL Server提供的发布与订阅功能,利用复制技术来实现数据同步,可以通过其提供的发布与订阅功能实现数据的读写分离和线下线上数据同步. ...

  9. 用JAVA SOCKET编程,读服务器几个字符,再写入本地显示

    Server: package cn.itcast.framework.socket;import java.io.BufferedReader; import java.io.IOException ...

最新文章

  1. Batch Normalization的TensorFlow实现
  2. 用python画花瓣-Python——画一棵漂亮的樱花树
  3. 1001.Reverse Root
  4. Docker 制作镜像的方式
  5. Python字符串模糊匹配库FuzzyWuzzy
  6. 网络爬虫之httpclient的使用
  7. 拼多多上买车,累计上线70个小时,成交订单9463笔!
  8. linux 定时任务 crond 服务介绍
  9. 分窗 Gram-Schmidt 高光谱降维的 水稻纹枯病检测
  10. scala中sorted,sortWith,sortBy用法详解
  11. windows7安装ffmpeg教程
  12. 学习一下物联网协议 wifi zigbee 蓝牙等等----从wifi就开始 wifi和wifi协议 关于wifi协议本身我们需要了解那些东西?
  13. Ubuntu下实现触摸板多指手势操作
  14. fai 自动安装debian 7.4
  15. UE4 C++ UMG框架搭建
  16. 面试高级算法梳理笔记
  17. 别让用户发呆——设计中的防呆策略【转】
  18. Ardupilot chibios IO固件,IO与FMU通信,固件下载(3)
  19. 华为智慧屏x1是鸿蒙系统吗,荣耀智慧屏x1和华为智慧屏s55有什么区别?哪个值得买...
  20. Android7.0 init进程源码分析

热门文章

  1. HXSafeGuard工程通过VS2010编译未安装VS2008出现以下错误
  2. k8s核心技术-Controller(statefulSet)_部署有状态应用---K8S_Google工作笔记0033
  3. 单片机工作笔记001---了解单片机MCS51
  4. basler 相机使用出现的问题
  5. android开发之添加按钮事件的方法
  6. Linux 下安装 Redis
  7. 3d激光雷达开发(pcl安装和使用)
  8. 搜索引擎的那些事(摘取价格数据)
  9. 背景裁剪图片html,HTML5基础加强css样式篇(文本裁剪,背景裁剪:background-origin,background-position,background-clip)(三十七)...
  10. 英特尔+性能+linux,Linux 4.20内核在英特尔处理器上性能比Linux 4.19低,附原因解释...