赞
踩
前天老师循序渐进的给了这个任务,具体任务内容如下,经过一天半的搜索拼凑调试,在各路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);/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。