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 所需结构体.函数. ...
随机推荐
- java基础学习系列二
循环语句 1,for(){} 2,while(){} 3,do{}while() continue和break用法 break是结束循环 continue结束本次循环
- Know your weapons Ⅱ
本次内容主要讲述使用UWP相关技术可以实现的软件上的一些功能,这里以Netease-Cloud Music(下称Cloud Music)为例讲述,这款音乐软件我个人一直在用,毕竟人们生活离不开音乐,说 ...
- 【Python】 xml转json
虽然python有解析xml的模块,也有生成json的模块,但是没有把这两者连接起来的模块. 下面是以来自MIT的大神Martin Blech写的一个方便的模块,供大家参考.也别忘了在用之前先拜谢作者 ...
- ionic start 创建ionic项目报错,及解决过程
问题描述: 前一次创建利用命令行创建ionic项目一次性成功,第二次没有运行: $ npm install -g ionic cordova 直接运行: ionic start ionicDemo 出 ...
- JDK1.8源码(五)——java.util.ArrayList 类
关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的. 1.ArrayList 定义 ArrayList 是一个用数组实 ...
- vue-过渡动画
本篇资料参考于官方文档: http://cn.vuejs.org/guide/transitions.html 概述: Vue 在跳转页面时,提供多种不同方式的动画过渡效果. ●in-out:新元素先 ...
- [活动] 【奖品撩人】部落守卫者集结令·这一回同程SRC的安全由“我”守卫!
i春秋SRC部落联合同程SRC发布首届部落守卫者漏洞提交任务(代号G001)! 你准备好了吗! [部落守卫者集结令]拿巨额奖金?上白帽子排行榜?近距离膜拜大佬?学技术?掌握窍门?又或者你是个责任感爆棚 ...
- CountDownLatch 使用说明
CountDownLatch是一种java.util.concurrent包下一个同步工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成. CountDownLatch的用法非常简单,下 ...
- C语言第四次作业--嵌套循环
一.PTA实验作业 题目1:打印九九口诀表 1.本题PTA提交列表 2.设计思路 (1)定义三个整形变量n,j,i,n表示任意给定的正整数. (2)输入一个正整数n. (3)令i=1,i<=n, ...
- c++第0次作业
1.你认为大学的学习生活.同学关系.师生应该是怎样? 随着大学生活的慢慢到来,我开始领悟到大学并不是自由的天堂,相反,我们更加的走进社会这个牢笼.在这个牢笼中有着从前的我们并不需要在意和考虑的规则与问 ...