c++实现socket以json格式传输图片

本文详细介绍了如何在C++中使用socket通信,并将数据封装为json格式进行图片传输。首先,概述了C++实现socket通信的步骤,包括服务端和客户端的建立与连接。接着,讨论了json的使用,提到了一个GitHub开源库nlohmann/json的便捷性。最后,阐述了通过base64编码将图片转换为字符串,通过json发送,服务端接收后解码并保存为图片的过程。文中引用了多个参考资料。
摘要由CSDN通过智能技术生成

前天老师循序渐进的给了这个任务,具体任务内容如下,经过一天半的搜索拼凑调试,在各路csdn博主清晰明了的优秀文章的帮助下,最后总算是实现了,简单总结下。

任务内容

1.C++实现socket通信;2.socket传输数据要封装成json格式;3.json传输图片

具体实现

一、c++实现socket通信

1.1.1服务端步骤:

1、加载套接字库,创建套接字(WSAStartup()/socket());

2、绑定套接字到一个IP地址和一个端口上(bind());

3、将套接字设置为监听模式等待连接请求(listen());

4、请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5、用返回的套接字和客户端进行通信(send()/recv());

6、返回,等待另一个连接请求;

7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

1.1.2方法详解:

1)加载Winsock库

 
/**
int WSAStartup(__in WORD wVersionRequested,__out  LPWSADATA lpWSAData);
此函数在应用程序中初始化winsockDLL,只有此函数调用成功后,应用程序才可以调用Windows SocketsDLL中的其他API函数,否则后面的任何函数都将调用失败
wVersionRequested -- 调用程序使用windows socket的最高版本。 高字节指定小的版本号,低字节指定高的版本号。
lpWSAData -- 指向WSADATA数据结构体指针,接收Windows Socket的实现细节。
返回值
如果成功,WSAStartup函数返下面列表显示的回0。否则,返之一回错误码。
*/   
    WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		return 0;
	}
	

2)创建套接字

/**
int socket (int domain, int type, int protocol)
初始化创建socket对象,成功时,返回非负数的socket描述符;失败是返回-1。
domain -- 指明使用的协议族,协议族决定了socket的地址类型,在通信中必须采用对应的地址,AF_INET表示ipv4地址(32位的)与端口号(16位的)的组合
type -- 指明socket类型,SOCK_STREAM表示TCP类型,保证数据顺序及可靠性;
protocol -- 通常赋值"0",由系统自动选择。
*/
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (slisten == INVALID_SOCKET)
	{
		printf("socket error !");
		return 0;
	}

3)配置监听地址和端口并绑定

/**
int bind(int sockfd, const struct sockaddr* myaddr, socklen_t addrlen)
返回值:0 -- 成功,-1 -- 出错
sockfd -- socket()函数返回的描述符
myaddr -- 指明要绑定的本地IP和端口号,使用网络字节序
addrlen -- 常被设置为sizeof(struct sockaddr)
*/   
 sockaddr_in sin;
	sin.sin_family = AF_INET;// IP地址家族
	sin.sin_port = htons(8888);/
  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值