Linux下Socket通信问题:传输了文件,却发送不了数据?红色程序如下:
client.c
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#define HELLO_WORLD_SERVER_PORT 6666
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
/*在控制台输入可执行文件,然后空格参数,就能将参数带入程序中*/
if(argc != 2)
{
printf("Usage: ./%s Server IP Address\n",argv[0]);
exit(1);
}
//设置client地址结构
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(client_addr));
client_addr.sin_family = AF_INET; //internet协议族
client_addr.sin_addr.s_addr = htons(INADDR_ANY); //INADDR_ANY表示自动获取本机地址
client_addr.sin_port = htons(0); //0表示自动分配一个空闲端口
//创建socket
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
//把client的socket和server的socket地址结构联系起来
if( bind(client_socket, (struct sockaddr*)&client_addr,
sizeof(client_addr)))
{
printf("Client Bind Port Failed!\n");
exit(1);
}
//设置地址结构server_addr,代表服务器的internet地址
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[1], &server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数
{
printf("Server IP Address Error!\n");
exit(1);
}
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
//发起连接,成功后client_socket代表了客户端和服务器的一个socket连接
if( connect(client_socket, (struct sockaddr*)&server_addr,
server_addr_length) < 0)
{
printf("Can Not Connect To %s!\n",argv[1]);
exit(1);
}
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name, FILE_NAME_MAX_SIZE + 1);
printf("Please Input File Name on Server:\t");
scanf("%s",file_name);
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?
BUFFER_SIZE:strlen(file_name));
//send:向服务器发送buffer中的数据
send(client_socket, buffer, BUFFER_SIZE, 0);
FILE *fp = fopen(file_name,"w");
if(NULL == fp)
{
printf("File: \t%s Can Not Open To Write\n",file_name);
exit(1);
}
//recv:从服务器接收数据到buffer中
bzero(buffer, BUFFER_SIZE);
int length = 0;
while( (length = recv(client_socket, buffer, BUFFER_SIZE, 0)))
{
printf("length=%d\n",length); //
if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n",argv[1]);
break;
}
int write_length = fwrite(buffer, sizeof(char),length,fp);
if(write_length < length)
{
printf("File: \t%s Write Failed\n",file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
printf("Recieve File: \t%s From Server[%s] Finished\n",file_name,argv[1]);
close(fp);
close(client_socket);
return 0;
}
server.c
#include<netinet/in.h> //for sockaddr_in
#include<sys/types.h> //for socket
#include<sys/socket.h> //for socket
#include<stdio.h>
#include<stdlib.h> //for exit
#include<string.h> //for bzero
#define HELLO_WORLD_SERVER_PORT 6666
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
//设置socket地址结构server_addr,代表服务器的internet地址,端口
struct sockaddr_in server_addr;
//把一段内存的内容全部设置为0
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
//创建流协议(TCP)socket,用server_socket代表服务器socket
int server_socket = socket(PF_INET, SOCK_STREAM, 0);
if( server_socket < 0)
{
printf("Create Socket Failed!");
exit(1);
}
//把socket和socket地址结构联系起来
if( bind(server_socket, (struct sockaddr*)&server_addr,
sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit(1);
}
//server_socket用于监听
if( listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
{
printf("Server Listen Failed!");
exit(1);
}
//服务器一直运行
while(1)
{
//定义client的地址结构client_addr
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
/*
accept函数特性:等待到有连接请求
把连接到的客户端信息填写到客户端的socket地址结构client_addr中
返回的新的socket(new_server_socket)代表server和client之间的一个通信通道
*/
int new_server_socket = accept( server_socket, (struct
sockaddr*)&client_addr, &length);
if( new_server_socket < 0)
{
printf("Server Accept Failec!\n");
break;
}
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE); //置buffer的前BUFFER_SIZE个字节为0且包括'\0'
//recv
length = recv( new_server_socket, buffer, BUFFER_SIZE, 0);
if( length < 0)
{
printf("Server Receive Data Failed!\n");
break;
}
printf("length=%d\n",length);//
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name, FILE_NAME_MAX_SIZE + 1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ?
FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n",file_name);
FILE *fp = fopen(file_name,"r"); //
if(NULL == fp)
{
printf("File: \t%s Not Found\n",file_name);
}
else
{
bzero(buffer, BUFFER_SIZE);
int file_block_length = 0;
while((file_block_length = fread(buffer, sizeof(char)
,BUFFER_SIZE,fp)) > 0)
{
printf("file_block_length = %d\n",file_block_length);
//发送buffer中的字符串到new_server_socket,实际是给客户端
if( send(new_server_socket, buffer, file_block_length,0) < 0)
{
printf("Send File: \t%s Failed\n",file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
fclose(fp);
printf("File: \t%s Transfer Finished\n",file_name);
}
//关闭与client的连接
close(new_server_socket);
}
//关闭监听用的socket
close(server_socket);
return 0;
}
[解决办法]
没太理解你的意思,我在linux下用gcc编译后能够正常传输文件。数据无误。
是不是你的客户端与服务器放在同一文件夹下执行的?
如果这样在传输时同时对一个文件进行读写操作,会造成文件最后传输结果为空文件。
看起来像是没有成功发送数据。
[解决办法]
那楼主的意思是想这个文件之前不要创建?