文章目录
- 流程伪代码
- 代码实现
- 加载库
- 创建套接字
- 连接服务端
- 收发数据
- 关闭套接字、卸载库
- 测试
流程伪代码
//1、加载库
//2、创建套接字
//3、连接服务端
while(true){
//4、发送数据
//5、接收数据
}
//6、关闭套接字、卸载库
代码实现
加载库
int err = 0;
WORD version = MAKEWORD(2, 2);
WSADATA wsaData;
err = WSAStartup(version, &wsaData);
if (err != 0) {
cout << "WSAStartup error:" << WSAGetLastError() << endl;
return 1;
}
if (2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion)) {
cout << "WSAStartup version error" << endl;
WSACleanup();
return 1;
}
else {
cout << "WSAStartup success" << endl;
}
创建套接字
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock) {
cout << "socket error:" << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
else {
cout << "socket success" << endl;
}
连接服务端
连接服务端我们使用的是connect()函数,分别为连接使用的socket,连接的地址信息,连接的地址信息长度。返回值为int类型,如果没有错误返回0,否则返回SOCKET_ERROR。
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(456789);
addrServer.sin_addr.S_un.S_addr = inet_addr("192.168.44.1");
int nLen = sizeof(addrServer);
err = connect(sock, (sockaddr*)&addrServer, nLen);
if (err == SOCKET_ERROR) {
cout << "connect error:" << WSAGetLastError() << endl;
closesocket(sock);
WSACleanup();
return 1;
}
else {
cout << "connect success" << endl;
}
收发数据
int nSendNum = 0;
char sendBuf[1024] = "";
int nRecvNum = 0;
char recvBuf[1024] = "";
while (true) {
//发送数据
gets_s(sendBuf);
nSendNum = send(sock, sendBuf, sizeof(sendBuf), 0);
if (nSendNum == SOCKET_ERROR) {
cout << "send error:" << WSAGetLastError() << endl;
break;
}
//接收数据
nRecvNum = recv(sock, recvBuf, sizeof(recvBuf), 0);
if (nRecvNum < 0) {
cout << "recv error" << WSAGetLastError() << endl;
break;
}
else {
cout << "say:" << recvBuf << endl;
}
}
关闭套接字、卸载库
closesocket(sock);
WSACleanup();
这样我们的TCP协议简单通讯就写好了。
测试
先运行服务端再运行客户端
没有什么问题,可以一人说一句话