怎样在C语言中实现用socket传送图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样在C语言中实现用socket传送图片相关的知识,希望对你有一定的参考价值。

用C语言,socket编程中发送与接受函数为send和recv,但是他们传送的是字符串,怎么实现传送图片,我的想法是用fopen打开图片文件,用fread将图片文件读到字符数组中,然后发送,在接收端用fwrite写到文件里,但是没有成功,不知什么问题,请高手指点。
int bytesSent;
char sendbuf[32];
int num=1,l;
FILE *fp;
if((fp=fopen("1.JPG","rb"))==NULL)

printf("cannot open file\n");
exit(0);

while(1)

num=fread(sendbuf,31, 1,fp);
if(num<1)

if(ferror(fp)!=0)

printf("fread error!\n");
exit(0);

else

l=sizeof(sendbuf);
sendbuf[l]='\0';
bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Letter send: %d\n", bytesSent );
break;


l=sizeof(sendbuf);
sendbuf[l]='\0';
bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
//printf( "Letter send: %s\n", bytesSent );

fclose(fp);
return;
以上是我编的客户端,文件是用二进制形式打开的:fp=fopen("1.JPG","rb"),但是怎么用send函数发送呢?我调试时看到sendbuf数组里有‘-1’和‘0’字符,如果发送,那不就发送第一个‘0’前面的字符吗?
具体应该怎么实现啊?谢谢各位指点。

参考技术A 每个包有大小限制的,图片可能是太大发送失败。
建议你在每个数据包里加一个类似序号的结构。然后图片数据传过去了用序号重新组合,如果缺少哪个序号,还可以用序号重新请求。
包结构:序号(2字节)+包长度(4字节)+部分图片数据
图片分成N份
传输方;有个合成新包的函数。有个处理缺包请求的函数。
接受方:有个检验碎片是否完全传过来的函数。有个组合图片碎片的函数。还应该有发送缺包请求功能的函数。
参考技术B 传字符是文本流,传所有的包括文本.图片要建立一个 文件流, 读取数据,然后用网络流socket发送 参考技术C

    创建网络套接字

    绑定端口

    建立连接

    发送图片(填上文件所在路径即可)

    断开连接

参考技术D 同样的,都是按二进制代码一个一个字节来传
因为socket发送和接受都有数据长度参数,发送是就按你输入的长度参数来发送数据,接受时就返回接受到的数据的长度。

C++ socket传送和接收结构体问题,求大神帮忙

结构体:
struct SendPackage

char opcode[32];
char SendMessage[1024];
char ReturnMessage[1024];
char ReturnCode[2];
;
类:

class CSubscriber

public:
CSubscriber(CSubscriber &subs);
CSubscriber();
virtual ~CSubscriber();
char p_subsid[20+1];
char p_custid[20+1];
char p_Acctid[20+1];
char p_Userid[20+1];
char p_ServerNum[20+1];
char p_Subsname[50+1];
char p_Status[50+1];
;
客户端代码:
SendPackage SendBi;//结构体
strcpy(subs.p_subsid,"123456");//subs是CSubscriber的对象。
strcpy(SendBi.SendMessage,(char*)&subs);
int SendLength = send(p_ClientSocket,
(char*)&SendBi,
sizeof(SendPackage),
0);
服务端代码:
ReceiveLen=recv(p_NewSocket, // 新的套接字句柄
p_ReceiveBuffer, // 接收套接字的缓冲区
2060, // 缓冲区的大小
0); // 标志为 0

得到的buffer是个结构体,我就想得到subs.p_subsid

发送者: 把结构体对象 通过 序列化 变成二进制缓存,然后 传输这个缓存。

接受者: 把接受二进制缓存 通过序列化 再组建成结构体对象
这个是现在最通用的标准

建议你使用下boost::serialization
参考技术A 在服务端也要定义这样的结构体
结构体:
struct SendPackage

char opcode[32];
char SendMessage[1024];
char ReturnMessage[1024];
char ReturnCode[2];
;
然后:
ReceiveLen=recv(p_NewSocket, // 新的套接字句柄
p_ReceiveBuffer, // 接收套接字的缓冲区
sizeof(struct SendPackage) , // 缓冲区的大小
0);
struct SendPackage *p_stu = (struct SendPackage*)p_ReceiveBuffer ;
cout << "sbusid=" << p_stu->SendMessage ;

但是看你前面的程序,好象有点问题吧:
strcpy(subs.p_subsid,"123456");//subs是CSubscriber的对象。
strcpy(SendBi.SendMessage,(char*)&subs); //肿么能将一个CSubscriber的对象拷贝到一个字符数组中去呢?
参考技术B int SendLength = send(p_ClientSocket,
(char*)&SendBi,
sizeof(SendPackage),
0);

(char*)&SendBi, 换为subs.p_subsid,大小换位 sizeof(subs.p_subsid)追问

说白了,我是要传结构体而后去解析结构体。不是想传单纯的值

以上是关于怎样在C语言中实现用socket传送图片的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中,数组作为参数,是怎样在函数之间传递的啊??

C语言socket高并发网络编程

怎样用C语言输出一个彩色的图案(不利用图片文件)?

怎样用C语言实现图片的RGB颜色空间向Lab颜色空间的转化??

Linux 下的 Socket 编程怎样解决粘包

用纯C语言 怎样编程,解析HTTP协议。