Linux下C语言socket通信实现发送读取的文件内容--简单实现代码
本次代码涉及到的内容:socket通讯,文件读取
读取的文件以及文件位置:
要读取的文件和c文件在同一个目录下。客户端(client)读取的是123.xml,服务端(server)读取的是23.xml。
头文件( mysocket.h):
/* File Name: mysocket.h*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h> /*
FunName:getFileAll
Desc:get the file content
Para:[fname] filename pointer
Return:1.[*pBuf] file content pointer
2.[*length] file length
*/
char *getFileAll(char *fname,int *length)
{
int fileLight = ;
char *pBuf; //定义文件指针
FILE *pFile; pFile = fopen(fname,"r"); //获取文件的指针
if(pFile == NULL)
{
printf("\nOpen file %s fail\n",pFile);
return NULL;
} fseek(pFile,,SEEK_END); //把指针移动到文件的结尾 ,获取文件长度
fileLight = ftell(pFile); //获取文件长度
pBuf =(char *)malloc(fileLight);
rewind(pFile); //把指针移动到文件开头 因为我们一开始把指针移动到结尾,如果不移动回来 会出错
fread(pBuf,,fileLight,pFile); //读文件
pBuf[fileLight]=; //把读到的文件最后一位 写为0 要不然系统会一直寻找到0后才结束
fclose(pFile); // 关闭文件
*length = fileLight;
return pBuf;
}
服务端(cservice.c):
/* File Name: cservice.c */
#include "mysocket.h" #define DEFAULT_PORT 8000 //监听端口号
#define MAXLINE 4096 int main(int argc, char** argv)
{
int socket_fd, connect_fd;
int length; //file content Light
struct sockaddr_in servaddr;
char buff[];
int n;
char *p;
char *fname="./23.xml";
if( (socket_fd = socket(AF_INET, SOCK_STREAM, )) == - ) //初始化Socket
{
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
}
//初始化
memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
servaddr.sin_port = htons(DEFAULT_PORT); //设置的端口为DEFAULT_PORT if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -) //将本地地址绑定到所创建的套接字上
{
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
} if( listen(socket_fd, ) == -) //开始监听是否有客户端连接
{
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
}
printf("======waiting for client's request======\n");
while()
{
if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -) //阻塞直到有客户端连接,不然多浪费CPU资源。
{
printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue;
} n = recv(connect_fd, buff, MAXLINE, ); //接受客户端传过来的数据
buff[n] = '\0';
printf("recv msg from client:\n%s\n", buff); p = getFileAll(fname,&length);
if( p == NULL )
{
printf("open file error!");
exit();
}
if(!fork()) //向客户端发送回应数据
{
if( send(connect_fd, p, length, ) < )
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
}
close(connect_fd);
exit();
}
close(connect_fd);
}
close(socket_fd); }
客户端(cclient.c)
/* File Name: cclient.c */ #include "mysocket.h" #define MAXLINE 4096 int main(int argc, char** argv)
{
int sockfd, n,rec_len;
int length; //file content Light
int i_port = ; //default 8000 port char recvline[];
char buf[MAXLINE];
char *c_ipAddr = "127.0.0.1"; //ip addr
char *p; //file content
char *fname="./123.xml"; //file name struct sockaddr_in servaddr; if( argc == )
{
printf("This client will connect server message: IP=127.0.0.1 , Port=8000 \n");
}
else if( argc == )
{
c_ipAddr = argv[];
printf("This client will connect server message: IP=%s , Port=8000 \n",c_ipAddr);
}
else if( argc == )
{
c_ipAddr = argv[];
i_port = atoi(argv[]);
printf("This client will connect server message: IP=%s , Port=%d \n",c_ipAddr, i_port);
}
else
{
printf("usage: ./client <ipaddress> and port \n");
exit();
} if( (sockfd = socket(AF_INET, SOCK_STREAM, )) < )
{
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
exit();
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(i_port); if( inet_pton(AF_INET, c_ipAddr, &servaddr.sin_addr) <= )
{
printf("inet_pton error for %s\n",argv[]);
exit();
} if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < )
{
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
exit();
} p = getFileAll(fname,&length);
if( p == NULL )
{
printf("open file error!");
exit();
} if( send(sockfd, p, length, ) < )
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit();
}
if((rec_len = recv(sockfd, buf, MAXLINE,)) == -)
{
perror("recv error");
exit();
} buf[rec_len] = '\0';
printf("Received :\n%s\n",buf);
close(sockfd);
exit();
}
makefile:
all: server client
.PHONY:all client:client.o
gcc client.o -o client
client.o:cclient.c
gcc -c cclient.c -o client.o
server:server.o
gcc server.o -o server
server.o:cservice.c
gcc -c cservice.c -o server.o .PHONY:clean clean:
rm -rf *.o
rm -rf server client
123.xml 文件:
<field name="123.xml" value=""/>
<field name="123test" value="123test"/>
23.xml文件:
<body>
<name>server</name>
</body>
编译:
执行 make 命令就会有 client,server 了。在两个窗口分别执行如下结果:
Linux下C语言socket通信实现发送读取的文件内容--简单实现代码的更多相关文章
- LINUX下C语言编程调用函数、链接头文件以及库文件
LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...
- linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- Linux 下smi/mdio总线通信
Linux 下smi/mdio总线通信 韩大卫@吉林师范大学 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. 将下面代码编译后,将可执 ...
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- linux 下C语言学习路线
UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
随机推荐
- SpringBoot工作机制
1:前言 回顾探索Spring框架 1.spring ioc IoC其实有两种方式,一种就是DI,而另一种是DL,即Dependency Lookup(依赖查找),前者是当前软件实体被动接受其依赖的其 ...
- python自学日志--基础篇(1)
从认识python,到学习python,中间经历了挺长一段时间的心理挣扎.人总是对未知的事物有着天生的恐惧感,但是,人又是对未知充斥好奇.所以在最后,还是推开了这扇门,开始学习python. pyth ...
- 打造Linux回收站
linux是没有回收站概念的,一旦误删除文件了是很难很难找回来的,对普通用户而言误删除文件就等于永久性不可逆丢失数据了:不过可以改造一下rm命令来变相实现回收站功能,实际上就是mv命令转移文件到指定路 ...
- 数据库 --> SQL 和 NoSQL 的区别
SQL 和 NoSQL 的区别 一.概念 SQL (Structured Query Language) 数据库,指关系型数据库.主要代表:SQL Server,Oracle,MySQL(开源), ...
- Matlab绘图基础——散点生成三角网(TIN)
%例一:二维三角网TIN模型的生成 X=rand(10,2)*5; dt=DelaunayTri(X(:,1),X(:,2)); %生成三角网 triplot(dt);hold on; ...
- linux小白成长之路1————通过Parallels安装CentOS虚拟机
以下是通过Mac版Parallels安装CentOS虚拟机的教程: 1.在Parallels向导中选择"下载CentOS",点击"继续":  2.点击&quo ...
- 爬取博主所有文章并保存到本地(.txt版)--python3.6
闲话: 一位前辈告诉我大学期间要好好维护自己的博客,在博客园发布很好,但是自己最好也保留一个备份. 正好最近在学习python,刚刚从py2转到py3,还有点不是很习惯,正想着多练习,于是萌生了这个想 ...
- 第 8 章 IO库
第 8 章 IO库 标签: C++Primer 学习记录 IO库 第 8 章 IO库 8.1 IO类 8.2 文件输入输出 8.1 string流 8.1 IO类 IO对象无拷贝或赋值,因此不能将形参 ...
- Java基础学习笔记二十三 Java核心语法之反射
类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...
- IDEA配置Struts框架
对于刚接触编程的同学,对框架只是还不是很了解,本文主要介绍在Idea上配置Struts,实现简单的页面跳转,以及页面参数传递. 在进行代码编写之前先对Idea进行一个简单了解,对于长时间接触编程的,对 ...