微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在c ++ windows中将图像文件从服务器发送到客户端

如何解决在c ++ windows中将图像文件从服务器发送到客户端

我正在使用套接字编程编写图像文件传输的代码在这里,客户端向服务器发送一个请求消息,将某个文件发送给客户端。从客户端收到消息后,服务器正在向客户端发送文本文件。 但现在我需要修改它以接收图像文件而不是文本文件

请帮我解决图片传输的代码

这是服务器和客户端代码

    //**server**
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <WS2tcpip.h>
#include <string>
#define SIZE 10241
#pragma comment (lib,"ws2_32.lib")



using namespace std;

void send_file(FILE* fp,int clientSocket) {
    //int n;
char data[SIZE] = { 0 };



while (fgets(data,SIZE,fp) != NULL) {
if (send(clientSocket,data,sizeof(data),0) == -1) {
perror("[-]Error in sending file.");
exit(1);
}
//bzero(data,SIZE);
//memset((data),'\0',(SIZE)),(void)0);
}
}

void main()
{
// Initialze winsock
WSADATA wsData;
WORD ver = MAKEWORD(2,2);

int wsOk = WSAStartup(ver,&wsData);
if (wsOk != 0)
{
cerr << "Can't Initialize winsock! Quitting" << endl;
return;
}

// Create a socket
SOCKET listening = socket(AF_INET,SOCK_STREAM,0);
if (listening == INVALID_SOCKET)
{
cerr << "Can't create a socket! Quitting" << endl;
return;
}
else
{
printf("socket created \n");
}

// Bind the ip address and port to a socket
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(54000);
hint.sin_addr.S_un.S_addr = INADDR_ANY; // Could also use inet_pton .... 

bind(listening,(sockaddr*)&hint,sizeof(hint));

// Tell Winsock the socket is for listening 
//listen(listening,SOMAXCONN);
if (listen(listening,SOMAXCONN) == SOCKET_ERROR) {
printf("Listen Failed with error: %ld\n",WSAGetLastError());
}
else {
printf("listening...\n");
}

// Wait for a connection
sockaddr_in client;
int clientSize = sizeof(client);

SOCKET clientSocket = accept(listening,(sockaddr*)&client,&clientSize);

char host[NI_MAXHOST];      // Client's remote name
char service[NI_MAXSERV];   // Service (i.e. port) the client is connect on

ZeroMemory(host,NI_MAXHOST); // same as memset(host,NI_MAXHOST);
ZeroMemory(service,NI_MAXSERV);

if (getnameinfo((sockaddr*)&client,sizeof(client),host,NI_MAXHOST,service,NI_MAXSERV,0) == 0)
{
cout << host << " connected on port " << service << endl;
}
else
{
inet_ntop(AF_INET,&client.sin_addr,NI_MAXHOST);
cout << host << " connected on port " <<
ntohs(client.sin_port) << endl;
}


FILE* fp = fopen("original.txt","r");

// Close listening socket
//closesocket(listening);

if (fp == NULL) {
perror("[-]Error in reading file.");
exit(1);
}

// While loop: accept and echo message back to client
char buf[4096];

//while (true)
//{
ZeroMemory(buf,4096);
// Wait for client to send data
int bytesReceived = recv(clientSocket,buf,4096,0);

if (bytesReceived > 0)
{
printf("Bytes received: %d\n",bytesReceived);
}
if (bytesReceived == SOCKET_ERROR)
{
//cerr << "Error in recv(). Quitting" << endl;
printf("recv Failed: %d\n",WSAGetLastError());
// break;
}

if (bytesReceived == 0)
{
cout << "Client disconnected " << endl;
// break;
}
cout << string(buf,bytesReceived) << endl;

// Echo message back to client
send(clientSocket,bytesReceived + 1,0);
send_file(fp,clientSocket);
printf("[+]File data sent successfully.\n");

printf("[+]Closing the connection.\n");


// Close the socket
closesocket(clientSocket);




//}



// Cleanup winsock
WSACleanup();
//system("pause");
}



//**client**

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <string>
#include <WS2tcpip.h>

#define SIZE 10241
#pragma comment(lib,"ws2_32.lib")

using namespace std;



void write_file(int sock) {
int n;
FILE* fp;

char buffer[SIZE];

fp = fopen("copy.txt","w");
while (1) {
n = recv(sock,buffer,0);
if (n <= 0) {
break;
return;
}
fprintf(fp,"%s",buffer);
//(memset((buffer),(SIZE)));

}
fclose(fp);
return;
}

void main()
{
string ipAddress = "127.0.0.1";         // IP Address of the server
int port = 54000;                       // Listening port # on the server

// Initialize WinSock
WSAData data;
WORD ver = MAKEWORD(2,2);
int wsResult = WSAStartup(ver,&data);
if (wsResult != 0)
{
cerr << "Can't start Winsock,Err #" << wsResult << endl;
return;
}

// Create socket
SOCKET sock = socket(AF_INET,0);
if (sock == INVALID_SOCKET)
{
cerr << "Can't create socket,Err #" << WSAGetLastError() << endl;
WSACleanup();
return;
}

// Fill in a hint structure
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET,ipAddress.c_str(),&hint.sin_addr);

// Connect to server
int connResult = connect(sock,sizeof(hint));
if (connResult == SOCKET_ERROR)
{
cerr << "Can't connect to server,Err #" << WSAGetLastError() << endl;
closesocket(sock);
WSACleanup();
return;
}



// Do-while loop to send and receive data

//int new_sock;
//struct sockaddr_in new_addr;
//socklen_t addr_size;
//char buffer[SIZE];

//addr_size = sizeof(new_addr);
//new_sock = accept(listen_socket,(struct sockaddr*)&new_addr,&addr_size);


char buf[4096];
string userInput;

do
{
// Prompt the user for some text
cout << "Write Data : ";
getline(cin,userInput);

if (userInput.size() > 0)       // Make sure the user has typed in something

{
// Send the text
int sendResult = send(sock,userInput.c_str(),userInput.size() + 1,0);
if (sendResult != SOCKET_ERROR)
{
// Wait for response
ZeroMemory(buf,4096);
int bytesReceived = recv(sock,0);
if (bytesReceived > 0)
{
// Echo response to console
cout << "SERVER :  " << string(buf,bytesReceived) << endl;

write_file(sock);
printf("Data received successfully\n");
}
}
}
break;
} while (userInput.size() > 0);
//  close down everything
closesocket(sock);

WSACleanup();

}

谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。