我試圖通過套接字發送文件。我創建了一個程序,它適用於文件類型,如.cpp,.txt和其他文本文件。但是二進制文件,圖像(.jpg,.png)和壓縮文件(如.zip和.rar)未正確發送。我知道這與文件大小無關,因爲我使用大型.txt文件進行了測試。我不知道這個問題,我收到了所有發送的字節,但文件無法打開。大多數時候文件已損壞,無法查看。我已經通過Google搜索了一個解決方案,並發現其他人遇到同樣的問題並且沒有解決方案。因此,通過幫助我,您也可以幫助其他需要解決方案的人。通過C++套接字發送圖像(Linux)
服務器代碼:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main (int agrc, char *argv[])
{
/******** Program Variable Define & Initialize **********/
int Main_Socket; // Main Socket For Server
int Communication_Socket; // Socket For Special Clients
int Status; // Status Of Function
struct sockaddr_in Server_Address; // Address Of Server
struct sockaddr_in Client_Address;// Address Of Client That Communicate with Server
int Port;
char Buff[100] = "";
Port = atoi(argv[2]);
printf ("Server Communicating By Using Port %d\n", Port);
/******** Create A Socket To Communicate With Server **********/
Main_Socket = socket (AF_INET, SOCK_STREAM, 0);
if (Main_Socket == -1)
{
printf ("Sorry System Can Not Create Socket!\n");
}
/******** Create A Address For Server To Communicate **********/
Server_Address.sin_family = AF_INET;
Server_Address.sin_port = htons(Port);
Server_Address.sin_addr.s_addr = inet_addr(argv[1]);
/******** Bind Address To Socket **********/
Status = bind (Main_Socket, (struct sockaddr*)&Server_Address, sizeof(Server_Address));
if (Status == -1)
{
printf ("Sorry System Can Not Bind Address to The Socket!\n");
}
/******** Listen To The Port to Any Connection **********/
listen (Main_Socket,12);
socklen_t Lenght = sizeof (Client_Address);
while (1)
{
Communication_Socket = accept (Main_Socket, (struct sockaddr*)&Client_Address, &Lenght);
if (!fork())
{
FILE *fp=fopen("recv.jpeg","w");
while(1)
{
char Buffer[2]="";
if (recv(Communication_Socket, Buffer, sizeof(Buffer), 0))
{
if (strcmp (Buffer,"Hi") == 0 )
{
break;
}
else
{
fwrite(Buffer,sizeof(Buffer),1, fp);
}
}
}
fclose(fp);
send(Communication_Socket, "ACK" ,3,0);
printf("ACK Send");
exit(0);
}
}
return 0;
}
客戶端代碼:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main (int agrc, char *argv[])
{
int Socket;
struct sockaddr_in Server_Address;
Socket = socket (AF_INET, SOCK_STREAM, 0);
if (Socket == -1)
{
printf ("Can Not Create A Socket!");
}
int Port ;
Port = atoi(argv[2]);
Server_Address.sin_family = AF_INET;
Server_Address.sin_port = htons (Port);
Server_Address.sin_addr.s_addr = inet_addr(argv[1]);
if (Server_Address.sin_addr.s_addr == INADDR_NONE)
{
printf ("Bad Address!");
}
connect (Socket, (struct sockaddr *)&Server_Address, sizeof (Server_Address));
FILE *in = fopen("background.jpeg","r");
char Buffer[2] = "";
int len;
while ((len = fread(Buffer,sizeof(Buffer),1, in)) > 0)
{
send(Socket,Buffer,sizeof(Buffer),0);
}
send(Socket,"Hi",sizeof(Buffer),0);
char Buf[BUFSIZ];
recv(Socket, Buf, BUFSIZ, 0);
if (strcmp (Buf,"ACK") == 0 )
{
printf("Recive ACK\n");
}
close (Socket);
fclose(in);
return 0;
}
這真的是Linux特有的? – Wizard79 2010-06-26 18:44:30
@Lorenzo - 如果你不知道是什麼問題,如何將一個事先知道嗎?你可以合理地詢問它是否與C++相關。我們在哪裏畫線? – Duck 2010-06-26 18:57:17
但是我沒有找到任何理由說這是Linux特有的問題。它可能出現在提供套接字接口的每個系統上。 – Wizard79 2010-06-26 19:12:33