myserver
#include <unistd.h>
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#define PORT_NUM 6666
#define LISTEN_MAX 20
#define FILENAME_LEN 512
#define BUF_MAX_LEN 1024
int main(int argc, char **argv)
{
//建立server主机信息
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT_NUM);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//建立socket
//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
int socket_server_fd; //socket 返回值
socket_server_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_server_fd == -1)
{
perror("socket create failed\n");
exit(1);
}
int opt =1;
setsockopt(socket_server_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
//bind //把socket和socket地址结构联系起来
socklen_t server_addrlen = sizeof(server_addr);
if ( bind(socket_server_fd, (struct sockaddr *)&server_addr, server_addrlen) == -1)
{
perror("bind failed\n");
exit(1);
}
//listen
if( listen(socket_server_fd, LISTEN_MAX) == -1)
{
perror("listen failed\n");
exit(1);
}
while(1)
{
//建立client主机信息 //定义客户端的socket地址结构client_addr
struct sockaddr_in client_addr;
//bzero(&client_addr, sizeof(client_addr));
//client_addr.sin_family = AF_INET;
//client_addr.sin_port = htons(PORT_NUM);
//client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//接受一个到server_socket代表的socket的一个连接
//如果没有连接请求,就等待到有连接请求--这是accept函数的特性
//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
//new_server_socket代表了服务器和客户端之间的一个通信通道
//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
socklen_t client_addrlen = sizeof(client_addr);
int server_client_fd;
server_client_fd = accept(socket_server_fd, (struct sockaddr *)&client_addr, &client_addrlen);
if(server_client_fd == -1)
{
perror("accept failed\n");
exit(1);
}
//int fread_len = fread(filename, sizeof(char), FILENAME_LEN, server_client_fd);
//从客户端读取数据
char buf[BUF_MAX_LEN];
bzero(buf, BUF_MAX_LEN);
recv(server_client_fd, buf, BUF_MAX_LEN, 0);
char filename[FILENAME_LEN];
bzero(filename, FILENAME_LEN);
strncpy(filename, buf, strlen(buf)>FILENAME_LEN ? FILENAME_LEN : strlen(buf));
printf("%s\n",filename);
FILE *fp = fopen(filename, "r");
if(fp == NULL)
{
perror("fopen failed....ll\n");
exit(1);
}
//begin send file
printf("send %s...\n", filename);
int fread_buf_len;
while( (fread_buf_len = fread(buf, sizeof(char), BUF_MAX_LEN, fp)) )
{
// fwrite(buf, sizeof(char), fread_buf_len, server_client_fd);
printf("file_block_length(fread_buf_len) = %d\n",fread_buf_len);
write(server_client_fd, buf, fread_buf_len);
}
printf("send %s ok\n", filename);
fclose(fp);
close(server_client_fd);
}
close(socket_server_fd);
return 0;
}
myclient
#include <arpa/inet.h>
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <unistd.h>
#define PORT_NUM 6666
#define LISTEN_MAX 20
#define FILENAME_LEN 512
#define BUF_MAX_LEN 1024
int main(int argc, char **argv)
{
struct sockaddr_in client_addr;
int socket_client = socket(AF_INET, SOCK_STREAM, 0);
//设置一个socket的sockaddr_in的结构体,存server的internet地址,端口
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT_NUM);
if ( inet_aton(argv[1], &server_addr.sin_addr) == 0 )
{
printf("Server IP Address Error!\n");
exit(1);
}
socklen_t server_addr_len = sizeof(server_addr);
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if ( connect(socket_client, (struct sockaddr *)&server_addr, server_addr_len) < 0 )
{
printf("Can Not Connect To %s!\n",argv[1]);
exit(1);
}
char filename[FILENAME_LEN];
bzero(filename, FILENAME_LEN);
char buf[BUF_MAX_LEN];
bzero(buf, BUF_MAX_LEN);
printf("Input get filename:\n");
scanf("%s", buf);
//gets(buf);
strncpy(filename, buf, strlen(buf)>BUF_MAX_LEN ? BUF_MAX_LEN : strlen(buf));
send(socket_client, filename, strlen(filename), 0); //发送给服务器server
//准备接收从服务器发来的数据
FILE *fp = fopen(filename, "w");
if(fp == NULL)
{
printf("File:%s Can Not Open To Write\n", filename);
exit(1);
}
printf("receive %s ...\n", filename);
int recv_len = 0;
while( (recv_len = recv(socket_client, buf, BUF_MAX_LEN, 0)) )
{
if(recv_len < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv[1]);
exit(1);
}
int fwrite_len = fwrite(buf, sizeof(char), recv_len, fp);
if(fwrite_len < recv_len)
{
printf("File:%s Write Failed\n", filename);
exit(1);
}
}
fclose(fp);
//printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);
printf("Receive %s ok .From Server[%s]\n", filename, argv[1]);
//关闭socket
close(socket_client);
return 0;
}