c++ win socket网络通信实例
作者:神秘网友
发布时间:2020-09-09 12:44:51
c++ win socket网络通信实例
c++ win socket网络通信实例
流程:
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
服务器端:
#include <iostream> #include<stdio.h> #include<WinSock2.h> #include<cstring> #pragma comment(lib, "ws2_32.lib") using namespace std; /********************全局常量*********************/ const int BUF_SIZE = 2048; /********************全局变量*********************/ SOCKET sockSer, sockCli; //socket SOCKADDR_IN addrSer, addrCli; //address SOCKADDR_IN将sin_addr与sin_port分开,方便赋值;SOCKADDR放在一起,方便传输 int naddr = sizeof(SOCKADDR_IN); char sendbuf[BUF_SIZE]; char inputbuf[BUF_SIZE]; char recvbuf[BUF_SIZE]; int main() { //加载socket库 WSADATA wsadata; if (WSAStartup(MAKEWORD(2, 1), &wsadata) != 0) //第一个参数,socket版本;第二个参数,socket通过它返回请求socket版本信息 { //输出出错信息 cout << "载入socket库失败" << endl; system("pause"); return 0; } //创建socket sockSer = socket(AF_INET, SOCK_STREAM, 0); //第一个参数地址协议族;第二个参数socket类型,如TCP(SOCK_STREAM)和UDP(SOCK_DGARM);第三个参数指定协议,0表示不想指定 //初始化地址包 addrSer.sin_addr.s_addr = inet_addr("192.168.1.107"); //inet_addr转换 网络ip 为 网络字节序二进制值 ; S_un是一个联合,S_addr是它的一种数据类型表示; 如果inet_addr报错就关掉VS的SDL安全检查 addrSer.sin_family = AF_INET; addrSer.sin_port = htons(12448); //1025~43000可任写,未被企业注册,注意防火墙 最大为65535 //绑定socket bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR)); while (1) { //监听连接请求,将其加入等待队列,等待accpet函数的接收 listen(sockSer, 5); //第一个参数监听连接请求;第二个参数等待连接队列最大长度 //接受连接请求 sockCli = accept(sockSer, (SOCKADDR*)&addrCli, &naddr); if (sockCli != INVALID_SOCKET) //连接成功 { cout << "连接成功!" << endl; strcpy(sendbuf, "hello!"); //发送数据 send(sockCli, sendbuf, sizeof(sendbuf), 0); } } closesocket(sockSer); closesocket(sockCli); WSACleanup(); return 0; }
客户端:
#include <iostream> //#include"stdafx.h" #include<stdio.h> #include<WinSock2.h> #include<cstring> #pragma comment(lib, "ws2_32.lib") using namespace std; /********************全局常量*********************/ const int BUF_SIZE = 2048; /********************全局变量*********************/ SOCKET sockSer, sockCli; //socket SOCKADDR_IN addrSer, addrCli; //address SOCKADDR_IN将sin_addr与sin_port分开,方便赋值;SOCKADDR放在一起,方便传输 int naddr = sizeof(SOCKADDR_IN); char sendbuf[BUF_SIZE]; char inputbuf[BUF_SIZE]; char recvbuf[BUF_SIZE]; int main() { //加载socket库 WSADATA wsadata; if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) { //输出出错信息 cout << "载入socket库失败" << endl; system("pause"); return 0; } //创建socket sockCli = socket(AF_INET, SOCK_STREAM, 0); //初始化客户端地址包 addrCli.sin_addr.s_addr = inet_addr("127.0.0.1"); addrCli.sin_family = AF_INET; addrCli.sin_port = htons(12248); //初始化服务器地址包 addrSer.sin_family = AF_INET; addrSer.sin_addr.s_addr = inet_addr("192.168.1.107"); addrSer.sin_port = htons(12448); while (1) { if (connect(sockCli, (SOCKADDR*)&addrSer, sizeof(addrSer)) != SOCKET_ERROR) //连接成功 { recv(sockCli, recvbuf, sizeof(recvbuf), 0); cout << recvbuf << endl; } } closesocket(sockSer); closesocket(sockCli); WSACleanup(); return 0; }