Linux下C语言socket通信实现发送读取的文件内容--简单实现代码

本次代码涉及到的内容:socket通讯,文件读取

读取的文件以及文件位置:

   要读取的文件和c文件在同一个目录下。客户端(client)读取的是123.xml,服务端(server)读取的是23.xml。

  Linux下C语言socket通信实现发送读取的文件内容--简单实现代码

头文件( 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语言socket通信实现发送读取的文件内容--简单实现代码

  Linux下C语言socket通信实现发送读取的文件内容--简单实现代码

上一篇:构建multipart/form-data实现文件上传


下一篇:Linux下的C Socket编程 -- server端的简单示例