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 所需结构体.函数. ...
随机推荐
- C语言第一次博客作业
一,PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...
- python分支
if xxx : xxxxx elif xxxx : xxxxx elif xxxx : xxxxx else: xxxxxx 分支可以有效节省CPU的运算时间.避免悬挂else的出现 三元表达式 s ...
- javascript中词法环境、领域、执行上下文以及作业详解
词法环境(Lexical Environments) 官方规范对词法环境的说明是:词法环境(Lexical Environments)是一种规范类型,用于根据ECMAScript代码的词法嵌套结构来定 ...
- Vue之七导航守卫
{ path:'/',component:Recommend,beforeEnter: (to, from, next) => { console.log(to); ajax('get','/a ...
- 源码实现 --> strdel
删除字符串中某个字符strdel 函数 char *strDel(char* str,const char chToDel) 不是库里面的函数,自己实现的原型,删除str中所有的chToDel字符. ...
- JSON解析的几种方式
在开发中,网络请求和json解析使用的频率是一样高的,因为网络请求返回来的一般都是json(当然还有xml),这里讨论的是json,网络请求的工具类前面我的博客已经写过了,这里给出网址:http:// ...
- mqtt异步publish方法
Python基于mqtt异步编程主要用到asyncio及第三方库hbmqtt,这里主要介绍mqtt的异步发布及遇到的一些问题. hbmqtt安装很简单,pip hbmqtt install. mqtt ...
- 掌握这些回答技术面试题的诀窍,让你offer拿到手软。
三.四月份,春回大地,万物复苏(请自带赵忠祥老师的BGM),又到了不少同学的跳槽时节. 最近一段时间团队也在招人,这期间筛选了不少简历,面试了一些候选人.这里谈谈我自己的对「怎样回答面试题」的理解. ...
- SpringMVC DispatcherServlet 启动和加载过程(源码调试)
在阅读本文前,最好先阅读以下内容(当然,如果对 Servlet 已经有所了解,则可跳过): http://www.cnblogs.com/cyhbyw/p/8682078.html http://ww ...
- 【Redis使用系列】redis设置登陆密码
找到安装redis的配置文件,找到redis.comf文件找到#requirepass foobared 新建一行 requirepass xxxx 你的密码 ,然后重启.再登录的时候可以登录,但是 ...