TCP
一.实验要求
1.传输文件
在客户端,用户选择本地的某个文件,并发送到服务器端。
在服务器端,接收客户端传输的数据流,并按 IP 地址保存在服务器端(文
件名重复的,可以覆盖)。
2.中断处理(还没做)
如果传输过程中服务器端发现客户端断开,服务器端应删除文件,并在屏
幕上提示,如“IP:1.2.3.4 发来 abcd.txt 文件过程中失去连接。”。如果客户端发
现服务器端不工作,客户端应有提示“服务器 1.2.3.5:62345 失去连接”。
二.实验步骤
1.创建server端
如果报错的话自己上网查一下错误怎么解决,都是小问题
#define _CRT_SECURE_NO_DEPRECATE
#pragma comment(lib,"Ws2_32.lib" )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#define SIZE 1024
//写入文件
void write_file(int sockfd) {
int n;
FILE* fp;
char filename[] = "recv.txt";
char buffer[SIZE];
fp = fopen(filename, "w");
while (1) {
n = recv(sockfd, buffer, SIZE, 0);
if (n <= 0)
{
break;
return;
}
fprintf(fp, "%s", buffer);
//bzero是linux下运用的函数,如果你是linux系统,就把ZeroMemory注释掉
//bzero(buffer, SIZE);
//ZeroMemory是Windows下运用的函数,两个函数是一样的
ZeroMemory(buffer, SIZE);
}
return;
}
//启动函数
void start()
{
WORD version(0);
WSADATA wsadata;
int socket_return(0);
version = MAKEWORD(2, 0);
socket_return = WSAStartup(version, &wsadata);//开始对套接字库的使用。
if (socket_return != 0)
{
exit(0);
}//这些不能少,如果少的话,就无法正确创建socket。
}
int main()
{
start();
char ip[] = "127.0.0.1";
int port = 8080;
int e;
int sockfd, new_sock;
struct sockaddr_in server_addr, new_addr;
int addr_size;
char buffer[SIZE];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("[-]Error in socket");
exit(1);
}
printf("[+]Server socket created successfully.\n");
server_addr.sin_family = AF_INET;
server_addr.sin_port = port;
server_addr.sin_addr.s_addr = inet_addr(ip);
e = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (e < 0) {
perror("[-]Error in bind");
exit(1);
}
printf("[+]Binding successfull.\n");
if (listen(sockfd, 10) == 0) {
printf("[+]Listening....\n");
}
else {
perror("[-]Error in listening");
exit(1);
}
addr_size = sizeof(new_addr);
new_sock = accept(sockfd, (struct sockaddr*)&new_addr, &addr_size);
write_file(new_sock);
printf("[+]Data written in the file successfully.\n");
return 0;
}
2.创建client端
#define _CRT_SECURE_NO_DEPRECATE
#pragma comment(lib,"Ws2_32.lib" )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock.h>
#define SIZE 1024
void send_file(FILE* fp, int sockfd) {
int n;
char data[SIZE] = { 0 };
while (fgets(data, SIZE, fp) != NULL) {
if (send(sockfd, data, sizeof(data), 0) == -1) {
perror("[-]Error in sending file.");
exit(1);
}
// bzero(data, SIZE);
ZeroMemory(data, SIZE);
}
}
void start()
{
WORD version(0);
WSADATA wsadata;
int socket_return(0);
version = MAKEWORD(2, 0);
socket_return = WSAStartup(version, &wsadata);//开始对套接字库的使用。
if (socket_return != 0)
exit(0);
//这些不能少,如果少的话,就无法正确创建socket。
}
int main() {
start();
char ip[] = "127.0.0.1";
int port = 8080;
int e;
int sockfd;
struct sockaddr_in server_addr;
FILE* fp;
char filename[] = "send.txt";
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("[-]Error in socket");
exit(1);
}
printf("[+]Server socket created successfully.\n");
server_addr.sin_family = AF_INET;
server_addr.sin_port = port;
server_addr.sin_addr.s_addr = inet_addr(ip);
e = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (e == -1) {
perror("[-]Error in socket");
exit(1);
}
printf("[+]Connected to Server.\n");
fp = fopen(filename, "r");
if (fp == NULL) {
perror("[-]Error in reading file.");
exit(1);
}
send_file(fp, sockfd);
printf("[+]File data sent successfully.\n");
printf("[+]Closing the connection.\n");
closesocket(sockfd);
return 0;
}
3.创建send.txt
在这里创建好你要发送的文件
4.运行server端
点了运行之后,不要关掉!!!!!!!!
5.运行client端
client端出现如下提示:
server端控制台输出为:
6.查看server端传输文件是否成功
发现新建了一个recv文件,打开后正是传输的文件
UDP
一.实验要求
1.传输文件
在客户端,用户选择本地的某个文件,并发送到服务器端。
在服务器端,接收客户端传输的数据流,并按 IP 地址保存在服务器端(文
件名重复的,可以覆盖)。
2.中断处理(还没做)
如果传输过程中服务器端发现客户端断开,服务器端应删除文件,并在屏
幕上提示,如“IP:1.2.3.4 发来 abcd.txt 文件过程中失去连接。”。如果客户端发
现服务器端不工作,客户端应有提示“服务器 1.2.3.5:62345 失去连接”。
二.实验步骤
1.创建server端
#define _CRT_SECURE_NO_DEPRECATE
#pragma comment(lib,"Ws2_32.lib" )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock.h>
#define SIZE 1024
void write_file(int sockfd, struct sockaddr_in addr)
{
char filename[] = "recv.txt";
int n;
char buffer[SIZE];
int addr_size;
// Creating a file.
FILE* fp = fp = fopen(filename, "w");
// Receiving the data and writing it into the file.
while (1)
{
addr_size = sizeof(addr);
n = recvfrom(sockfd, buffer, SIZE, 0, (struct sockaddr*)&addr, &addr_size);
if (strcmp(buffer, "END") == 0)
break;
printf("[RECEVING] Data: %s", buffer);
fprintf(fp, "%s", buffer);
//linux下这样写
// bzero(buffer, SIZE);
ZeroMemory(buffer, SIZE);
}
fclose(fp);
}
//这是在启动
void start()
{
WORD version(0);
WSADATA wsadata;
int socket_return(0);
version = MAKEWORD(2, 0);
socket_return = WSAStartup(version, &wsadata);//开始对套接字库的使用。
if (socket_return != 0)
exit(0);
}
int main()
{
start();
// Defining the IP and Port
char ip[] = "127.0.0.1";
const int port = 8080;
// Defining variables
int server_sockfd;
struct sockaddr_in server_addr, client_addr;
char buffer[SIZE];
int e;
// Creating a UDP socket
server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (server_sockfd < 0)
{
perror("[ERROR] socket error");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = port;
server_addr.sin_addr.s_addr = inet_addr(ip);
e = bind(server_sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (e < 0)
{
perror("[ERROR] bind error");
exit(1);
}
printf("[STARTING] UDP File Server started. \n");
write_file(server_sockfd, server_addr);
printf("[SUCCESS] Data transfer complete.\n");
printf("[CLOSING] Closing the server.\n");
closesocket(server_sockfd);
return 0;
}
2.创建client端
#define _CRT_SECURE_NO_DEPRECATE
#pragma comment(lib,"Ws2_32.lib" )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<winsock.h>
#define SIZE 1024
void send_file_data(FILE* fp, int sockfd, struct sockaddr_in addr)
{
int n;
char buffer[SIZE];
// Sending the data
while (fgets(buffer, SIZE, fp) != NULL)
{
printf("[SENDING] Data: %s", buffer);
n = sendto(sockfd, buffer, SIZE, 0, (struct sockaddr*)&addr, sizeof(addr));
if (n == -1)
{
perror("[ERROR] sending data to the server.");
exit(1);
}
//linux
//bzero(buffer, SIZE);
ZeroMemory(buffer, SIZE);
}
// Sending the 'END'
strcpy(buffer, "END");
sendto(sockfd, buffer, SIZE, 0, (struct sockaddr*)&addr, sizeof(addr));
fclose(fp);
}
void start()
{
WORD version(0);
WSADATA wsadata;
int socket_return(0);
version = MAKEWORD(2, 0);
socket_return = WSAStartup(version, &wsadata);//开始对套接字库的使用。
if (socket_return != 0)
{
exit(0);
}//这些不能少,如果少的话,就无法正确创建socket。
}
int main(void)
{
start();
// Defining the IP and Port
char ip[] = "127.0.0.1";
const int port = 8080;
// Defining variables
int server_sockfd;
struct sockaddr_in server_addr;
char filename[] = "send.txt";
FILE* fp = fopen(filename, "r");
// Creating a UDP socket
server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (server_sockfd < 0)
{
perror("[ERROR] socket error");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = port;
server_addr.sin_addr.s_addr = inet_addr(ip);
// Reading the text file
if (fp == NULL)
{
perror("[ERROR] reading the file");
exit(1);
}
// Sending the file data to the server
send_file_data(fp, server_sockfd, server_addr);
printf("[SUCCESS] Data transfer complete.\n");
printf("[CLOSING] Disconnecting from the server.\n");
closesocket(server_sockfd);
return 0;
}
3.其余步骤
其余步骤与TCP相同,只有代码不一样