前天老师循序渐进的给了这个任务,具体任务内容如下,经过一天半的搜索拼凑调试,在各路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);// 填写端口,1~1024是保留端口号,可以使用大于1024中任何一个没有被占用的端口号
sin.sin_addr.S_un.S_addr