c 언어는 socket 서버/클라이언트가 tcp를 통해 파일을 전송하는 것을 실현한다
/*client.c*/
#include // for sockaddr_in
#include // for socket
#include // for socket
#include // for printf
#include // for exit
#include // for bzero
#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 ServerIPAddress
", argv[0]);
exit(1);
}
// socket client_addr, internet
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); // auto allocated,
// internet (TCP) socket, client_socket socket
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0)
{
printf("Create Socket Failed!
");
exit(1);
}
// socket socket
if (bind(client_socket, (struct sockaddr*)&client_addr, sizeof(client_addr)))
{
printf("Client Bind Port Failed!
");
exit(1);
}
// socket server_addr, internet
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
// IP
if (inet_aton(argv[1], &server_addr.sin_addr) == 0)
{
printf("Server IP Address Error!
");
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!
", argv[1]);
exit(1);
}
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name, sizeof(file_name));
printf("Please Input File Name On Server.\t");
scanf("%s", file_name);
char buffer[BUFFER_SIZE];
bzero(buffer, sizeof(buffer));
strncpy(buffer, file_name, strlen(file_name) > BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name));
// buffer , buffer
send(client_socket, buffer, BUFFER_SIZE, 0);
FILE *fp = fopen(file_name, "w");
if (fp == NULL)
{
printf("File:\t%s Can Not Open To Write!
", file_name);
exit(1);
}
// buffer
bzero(buffer, sizeof(buffer));
int length = 0;
while(length = recv(client_socket, buffer, BUFFER_SIZE, 0))
{
if (length < 0)
{
printf("Recieve Data From Server %s Failed!
", argv[1]);
break;
}
int write_length = fwrite(buffer, sizeof(char), length, fp);
if (write_length < length)
{
printf("File:\t%s Write Failed!
", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
printf("Recieve File:\t %s From Server[%s] Finished!
", file_name, argv[1]);
// , socket
fclose(fp);
close(client_socket);
return 0;
}
/*server.c*/
#include
#include
#include
#include
#include
#include
#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)
{
// set socket's address information
// socket server_addr, internet
struct sockaddr_in server_addr;
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);
// create a stream socket
// internet (TCP)socket, server_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)
{
// socket client_addr, , accept
// , client client_addr
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
// client server , client_addr
// , , accept ,
// select()
// accpet socket, socket server client
// new_server_socket
int new_server_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
if (new_server_socket < 0)
{
printf("Server Accept Failed!
");
break;
}
char buffer[BUFFER_SIZE];
bzero(buffer, sizeof(buffer));
length = recv(new_server_socket, buffer, BUFFER_SIZE, 0);
if (length < 0)
{
printf("Server Recieve Data Failed!
");
break;
}
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name, sizeof(file_name));
strncpy(file_name, buffer,
strlen(buffer) > FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE : strlen(buffer));
FILE *fp = fopen(file_name, "r");
if (fp == NULL)
{
printf("File:\t%s Not Found!
", 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
", file_block_length);
// buffer new_server_socket,
if (send(new_server_socket, buffer, file_block_length, 0) < 0)
{
printf("Send File:\t%s Failed!
", file_name);
break;
}
bzero(buffer, sizeof(buffer));
}
fclose(fp);
printf("File:\t%s Transfer Finished!
", file_name);
}
close(new_server_socket);
}
close(server_socket);
return 0;
}
코드를 네트워크에 베끼다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
leetcode 퀴즈 투어(1)이것은 문제 풀이 여행의 첫 번째 편으로 귀속에 대한 총결로 제목은 주로 체인 테이블과 두 갈래 나무를 포함한다.이전에 귀환을 고려할 때 귀환의 한 걸음 한 걸음 조작을 고려했기 때문에 세부 사항을 모두 똑똑히 알아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.