一. 服务器端接收
#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<fcntl.h>
#define SERV_IP "106.15.74.16"
#define SERV_PORT 6666
#define FILE_NAME "/home/pang/shipin.mp4"
int main()
{
int lfd,cfd,i=1;
int fd1;
struct sockaddr_in serv_addr,clie_addr; // 结构体sockaddr_in 用来处理网络通信的地址,在头文件<arpa/inet.h>中定义
socklen_t clie_addr_len; //socklen_t类似unsigned int
char buf[1024];
int n;
lfd = socket(AF_INET,SOCK_STREAM,0); //int socket(int domain, int type, int protocol); AF_INET表示IPv4 Internet协议;SOCK_STREAM(流式套接字)TCP连接;
//通常某协议中只有一种特定类型,这样protocol参数仅能设置为0;
/*这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。
如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。*/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT); //服务器端端口
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY表示随机,没有绑定具体的ip
bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); //通过bind函数把socket和协议,IP地址,端口号三个要素绑定起来
listen(lfd,128); //int listen(int s, int backlog);成功返回0;如果socket 为AF_INET 则参数backlog 最大值可设至128.
clie_addr_len = sizeof(clie_addr);
cfd = accept(lfd,(struct sockaddr *)&clie_addr,&clie_addr_len); /*函数的第一个参数用来标识服务端套接字(也就是listen函数中设置为监听状态的套接字),
第二个参数是用来保存客户端套接字对应的“地方”(包括客户端IP和端口信息等), 第三个参数是“地方”的占地大小。返回值对应客户端套接字标识。*/
fd1=open(FILE_NAME,O_RDWR|O_CREAT); //O_CREAT表示如果指定文件不存在,则创建这个文件
if(fd1<0)
perror("open file error\n");
while((n=read(cfd,buf,1024)))
{
printf(" %d ",i);
if(write(fd1,buf,n)!=n) //把buf中的数据写到fd1中
perror("write failed\n");
else
i++;
}
close(lfd);
close(cfd);
return 0;
}
二. 客户端发送
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#define SERV_IP "106.15.74.16"
#define SERV_PORT 6666
#define ITEMSIZE 3
#define WIDEIMAGE 500
int main()
{
int cfd, fd;
struct sockaddr_in serv_addr;
socklen_t serv_addr_len;
char readChar[ITEMSIZE], writeChar[1024];
int count, j = 1;
cfd = socket(AF_INET, SOCK_STREAM, 0); //创建一个socket
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr); //IP地址转换函数;将“点分十进制” -> “二进制整数”; 第一个参数af是地址簇,第二个参数*src是来源地址,第三个参数* dst接收转换后的数据。
connect(cfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); /*第一个参数是客户端的套接字(表明即将发起连接请求),
第二个参数是服务端的套接字所在的“地方”(“地方”是我自定义的专有名词),
第三个参数是该“地方”的大小。 如果请求连接成功,则返回0,否则返回错误码。*/
fd = open("shipin.mp4", O_RDONLY | O_WRONLY | O_CREAT); //O_CREAT表示如果指定文件不存在,则创建这个文件
while (1) {
count = read(cfd, readChar, ITEMSIZE);
//write(fd,buf,sizeof(buf));
if (count == 0) {
break;
}
readChar[count] = '\0';
count = sprintf(writeChar, "%02x%02x%02x ",readChar[0] & 0x00FF, readChar[1] & 0x00FF, readChar[2] & 0x00FF);
writeChar[count] = '\0';
write(fd, writeChar, count);
if (count < ITEMSIZE)
{
break;
}
if (j++ % WIDEIMAGE == 0)
{
write(fd, "\n", 1);
}
}
close(fd);
close(cfd);
return 0;
}