本次代码涉及到的内容: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通信实现发送读取的文件内容--简单实现代码的更多相关文章

  1. LINUX下C语言编程调用函数、链接头文件以及库文件

    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

  2. linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...

  3. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  4. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  5. Linux 下smi/mdio总线通信

    Linux 下smi/mdio总线通信 韩大卫@吉林师范大学 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. 将下面代码编译后,将可执 ...

  6. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  7. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  8. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

  9. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

随机推荐

  1. extract-text-webpack-plugin---webpack插件

    var ExtractTextPlugin=require('extract-text-webpack-plugin');//build使用 { test:/\.css$/, use:ExtractT ...

  2. 兄弟连学Python-Mysql的操作应用

    1.创建数据库 格式: create database if not exists 数据库名 default charset utf8; 注意: 1.数据库是唯一的 2.if not exists先判 ...

  3. Dynamics 365 Online-使用Azure Logic App 与 Dynamics 365 集成

    什么是Logic App? Azure Logic App 是微软发布的集成平台的产品,有助于生成,计划和自动完成工作流形式的流程,适合跨企业或组织集成,数据,系统和服务.与此同时,Logic App ...

  4. C语言中数据类型的取值范围

    C语言中数据类型的取值范围如下:char -128 ~ +127 (1 Byte)short -32767 ~ + 32768 (2 Bytes)unsigned short 0 ~ 65536 (2 ...

  5. windows+CMake+mingw 搭建c c++开发环境

    layout: post title: "windows+CMake+mingw 搭建c c++开发环境" date: 2018-03-30 22:23:06 tags: wind ...

  6. python内置函数 divmod()

    先来看一下builtins.py中的代码: def divmod(x, y): # known case of builtins.divmod """ Return th ...

  7. gitignore忽略规则

    我们用git提交本地代码时,有些文件或日志是不需要提交的,这个时候可以用.gitignore来解决这个问题: 首先,我们需要创建一个.gitignore文件,用命令输入 touch .gitignor ...

  8. Beta No.6

    今天遇到的困难: github服务器响应很慢 推图的API接口相应较慢,超过了初始设定的最大延迟时间,导致了无法正确返回图片 ListView滑动删除Demo出现了某些Bug,这些Bug可能导致了某些 ...

  9. HDFS之HA机制

  10. TensorFlow问题“The TensorFlow library wasn't compiled to use SSE instructions, but these are available on your machine and could speed up CPU computations.”

    出现的问题: 在使用TensorFlow跑官方教程例子时报以下warning: 虽程序能正常跑出结果,但作为一名强迫症患者对此很是不爽,于是查找资料找到隐藏该warning的解决办法. 解决办法: 在 ...