我是发送数据从客户端到服务器,但图片没有收到完整。
客户代码:
FILE *fr = fopen(tmppicsend, "rb");
char* buffer;
buffer = (char*) malloc(sizeof(char)*size);
fread(buffer, size, 1, fr);
send_len_pic = send( m_socket_pic, buffer, size, 0 );
recv( m_socket_pic, rec_end_check, 32, 0 );
fclose(fr);
free(buffer);服务器代码:
FILE *fw = fopen(fname, "wb");
char* buffer;
buffer = (char*) malloc(sizeof(char)*size);
int rec_len = recv( current_client, buffer, size, 0 );
buffer[size]='\0';
fwrite(buffer, size, 1, fw);
size -= size;
free(buffer);
fclose(fw);配置插座:
WSADATA wsaData_pic;
SOCKET m_socket_pic;
SOCKET m_backup_pic;
sockaddr_in con_pic;
// Initialize Winsock.
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData_pic );
if ( iResult != NO_ERROR ){
//printf("Error at WSAStartup()\n");
}
// Create a socket.
m_socket_pic = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket_pic == INVALID_SOCKET ) {
//printf( "Error at socket(): %ld\n", WSAGetLastError() );
//WSACleanup();
}
m_backup_pic = m_socket_pic;
// Connect to a server.
con_pic.sin_family = AF_INET;
con_pic.sin_addr.s_addr = inet_addr( ip );
con_pic.sin_port = htons( 2200 );
if ( connect( m_backup_pic, (SOCKADDR*) &con_pic, sizeof(con_pic) ) == SOCKET_ERROR) {
//printf( "Failed to connect.\n" );
//WSACleanup();
}else
{
m_socket_pic=m_backup_pic;
}
}当我比较这些图片时,我看到了序列号数据包中的错误(数据包不定期接收)。图片(来自客户端和服务器的Pic)大小相同。我想发送JPEG图片。
救救我坦克。
发布于 2013-10-22 06:44:44
我曾多次尝试回答。
这个问题最好的答案是:
将客户端与服务器同步以发送流。
因为recv()函数i比send()函数慢,所以客户端发送服务器能够接收的数据量。
客户端代码:
char* bufferCMP;
bufferCMP = (char*)malloc(sizeof(char) * size);
p_file = fopen(tmppicsend,"rb");
fread(bufferCMP, 1, size , p_file);
fclose(p_file);
int chunkcount = size / DEFAULT_BUFLEN;
int lastchunksize = size - (chunkcount * DEFAULT_BUFLEN);
int fileoffset=0;
//Sending Actual Chunks
while (chunkcount > 0)
{
iResult = send( m_socket_pic, bufferCMP + (fileoffset * DEFAULT_BUFLEN) , DEFAULT_BUFLEN , 0 );
fileoffset++;
chunkcount--;
if (iResult != DEFAULT_BUFLEN)
{
//printf("Sending Buffer size <> Default buffer length ::: %d\n",WSAGetLastError());
}
else
{
//printf("Sending Buffer size = %d \n", iResult);
}
}
//Sending last Chunk
iResult = send( m_socket_pic, bufferCMP + (fileoffset * DEFAULT_BUFLEN) , lastchunksize , 0 );服务器代码:
int FileCounter=0;
bool flg=true;
char * fileComplete;
char * filesizeBuffer;
FILE *temp;
int iResult;
int receiveBuffer = 0;
int desiredRecBuffer = size ;
//int desiredRecBuffer = DEFAULT_BUFLEN ;
fileComplete = (char*) malloc (sizeof(char)* size );
while (desiredRecBuffer > 0)
{
iResult = recv( current_client, fileComplete + receiveBuffer , desiredRecBuffer , 0 );
//iResult = recv( ClientSocket, fileComplete + receiveBuffer , fileSize , 0 );
if (iResult < 1)
{
//printf("Reveive Buffer Error %d \n", WSAGetLastError());
}
else
{
receiveBuffer += iResult;
desiredRecBuffer = size - receiveBuffer ;
//printf("Reveived Data size : %d \n", iResult);
}
}
FILE *File = fopen(fname, "wb");
fwrite(fileComplete,1, size , File);
//flg = true;
free(fileComplete);
fclose(File);发布于 2013-09-28 08:15:11
你在犯通常的错误。不能假设recv()填充了缓冲区。您必须循环直到得到所需的所有数据,并且必须使用recv()返回的计数值。
发布于 2013-10-02 07:32:15
您如何知道要在服务器端接收的数据的大小?您应该在服务器和客户端之间建立某种协议(由您自己定义)。最简单的方法是首先发送uint64_t (8个字节),它将保存图片大小,然后发送数据本身。然后,在服务器读取这些前8个字节之后,它将知道预期的数据数量。然后,只需重复recv()调用,直到得到客户机发送的所有数据。在服务器端使用select()等待下一个数据部分可用是个好主意。顺便说一句,如果您试图发送的图片足够大(在大多数情况下是真的),则它是通过tcp或udp连接部分发送的,而不是由一个大片段发送的。它是不可预测的(硬件决定它),有多大的碎片或其中的多少将被发送。因此,您绝对应该准备好反复调用recv()来接收客户端发送给服务器的所有数据。
https://stackoverflow.com/questions/18983370
复制相似问题