如何在mfc制作的聊天程序下实现发送图片
1、首先,图片是一个文件,如果要发送到其它的设备,必须通过一种传方式实现发送,通常MFC聊天程序的发送多半是通过网络协议实现的,最简单的就是TCP\UDP\HTTP等,这些常用的网络协议,常用的协议参考下图所示

2、这里我里使用TCP协议实现图片的发送,其实就是将图片数据读取到内存,然后通过TCP协议封装成数据包发送到对端,对端接收后,再将数据写入到文件就可以实现了,具体的TCP数据包结构,可以参考下图

3、接下来,我们新建一个MFC示例工程,用来简单的实现TCP发送代码,工程创建过程如下图所示


4、这里只写出客户端的发送代码,接收端的接收实现原理其实也是一样的,只不过多了监听TCP链接的步骤

5、接下来是读取文件的代码实现,文件其实也是二进制数据,只需要把数据读入内存,再通过tcp的发送接口发送给对方就可以了

6、接下来,我把完整的发送代码写下来,实现TCP发送图片的功能,代码如下:
FILE* pf = NULL;
SOCKET conn = INVALID_SOCKET;
WSADATA wsaData;
struct hostent *hp;
unsigned int addr;
struct sockaddr_in server;
int wsaret, len;
char buffer[4096] = { 0 };
do
{
wsaret = WSAStartup(0x101, &wsaData);
if (wsaret)
break;
conn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (conn == INVALID_SOCKET)
break;
addr = inet_addr("127.0.0.1");
hp = gethostbyaddr((char*)&addr, sizeof(addr), AF_INET);
if (hp == NULL)
{
break;
}
server.sin_addr.s_addr = *((unsigned long*)hp->h_addr);
server.sin_family = AF_INET;
server.sin_port = htons(20248);
if (connect(conn, (struct sockaddr*)&server, sizeof(server)))
{
break;
}
pf = fopen("d:\\123.png", "rb");
if (pf == NULL)
break;
while (1)
{
len = fread(buffer, 1, 4096, pf);
if (len <= 0)
break;
send(conn, buffer, len, 0);
}
} while (0);
if (pf)
fclose(pf);
if (conn != INVALID_SOCKET)
closesocket(conn);

7、这里需要注意一点就是,因为TCP是可靠的字节流式发送,如果使用同一个套接字发送,即发送图片也发送文本等,需要做好TCP的分包,不然后接收端无法识别数据内容