您现在的位置是:首页 >技术交流 >VS、C++、TCPIP通讯 网站首页技术交流
VS、C++、TCPIP通讯
简介VS、C++、TCPIP通讯
目录
前言
用于TCPIP通讯的代码,避免遗忘,做了注释
一、VS属性设置
vs属性页 → C/C++ → 常规 → SDL检查选择 “否(/sdl-)”
vs属性页 → C/C++ → 预处理器 → 预处理器定义,添加WIN32_LEAN_AND_MEAN
按以下顺序进行包含,可以避免重复包含的冲突
#include "WinSock2.h" #include "windows.h" #include "stdafx.h"
二、c++文件
tcpSocket.h
#ifndef _TCPSOCKET_H_
#define _TCPSOCKET_H_
#include<WinSock2.h> // windows平台的网络库头文件
#pragma comment(lib,"ws2_32.lib") // 库文件
#include <stdbool.h> // bool类型
#include <stdio.h>
#define PORT 502 // [0,65536) 0~1024是保留端口
#define err(errMsg) printf("[line:%d]%s failed code %d",__LINE__, errMsg, WSAGetLastError())
// 打开网络库
bool init_Socket();
// 关闭网络库
bool close_Socket();
// 创建服务器socket
SOCKET createServerSocket();
// 创建客户端socket
SOCKET createClientSocket(const char* ip);
#endif // !_TCPSOCKET_H_
tcpSocket.cpp
#include "tcpSocket.h"
bool init_Socket()
{
// windows socket async,windows异步套接字
// 参数1:请求的socket版本,如2.2 2.1 1.0
// 参数2:传出参数
WSADATA wsadata;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
{
printf("WSAStartup failed code %d", WSAGetLastError());
return false;
}
return true;
}
bool close_Socket()
{
if (0 != WSACleanup())
{
printf("WSACleanup failed code %d", WSAGetLastError());
return false;
}
return true;
}
SOCKET createServerSocket()
{
// 1、创建空的Socket
// 参数1:sf 地址协议族 ipv4 ipv6
// 参数2:type 传输协议类型 流式套接字 数据包
// 参数3:protocl 使用具体的某个传输协议
SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd == INVALID_SOCKET) // 查看socket是否创建成功
{
err("socket");
return INVALID_SOCKET;
}
// 2、给socket绑定ip地址和端口号
struct sockaddr_in addr;
addr.sin_family = AF_INET; // 和创建socket时的必须一样
addr.sin_port = htons(PORT); // 大端存储和小端存储
addr.sin_addr.S_un.S_addr = ADDR_ANY; // inet_addr("127.0.0.1");ADDR_ANY绑定本机任意网卡的任意IP
if (SOCKET_ERROR == bind(fd, (const sockaddr*) & addr, sizeof(addr)))
{
err("bind");
return false;
}
// 3、监听电话
listen(fd, 10);
return fd;
}
SOCKET createClientSocket(const char* ip)
{
// 1、创建空的Socket
// 参数1:sf 地址协议族 ipv4 ipv6
// 参数2:type 传输协议类型 流式套接字 数据包
// 参数3:protocl 使用具体的某个传输协议
SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd == INVALID_SOCKET) // 查看socket是否创建成功
{
err("socket");
return INVALID_SOCKET;
}
// 2、与服务器建立连接
struct sockaddr_in addr;
addr.sin_family = AF_INET; // 和创建socket时的必须一样
addr.sin_port = htons(PORT); // 大端存储和小端存储
addr.sin_addr.S_un.S_addr = inet_addr(ip); // ADDR_ANY绑定本机任意网卡的任意IP
if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr)))
{
err("connect");
return false;
}
return fd;
}
server.cpp
#include "../tcpSocket/tcpSocket.h" // 选择合适路径
int main()
{
init_Socket();
SOCKET serfd = createServerSocket();
printf("wait client connect...
");
// 如果有客户端请求连接
SOCKET clifd = accept(serfd, NULL, NULL);
if (INVALID_SOCKET == clifd) // 如果失败
{
err("accept");
}
//可以和客户端进行通信了
char sendbuf[BUFSIZ] = { 0 };
char recvbuf[BUFSIZ] = { 0 };
while (true)
{
// recv从指定的socket接收消息
if (0 < recv(clifd, recvbuf, BUFSIZ, 0))
{
printf("recv:%s
", recvbuf);
memset(recvbuf, 0, sizeof(recvbuf));
}
// 发送消息
printf("send>");
memset(sendbuf, 0, sizeof(sendbuf));
gets_s(sendbuf, BUFSIZ);
if (SOCKET_ERROR == send(clifd, sendbuf, strlen(sendbuf), 0))
{
err("send");
}
}
// 关闭
closesocket(clifd);
closesocket(serfd);
close_Socket();
printf("server----------end----------
");
getchar();
return 0;
}
client.cpp
#include "../tcpSocket/tcpSocket.h" // 选择合适路径
int main()
{
init_Socket();
SOCKET fd = createClientSocket("127.0.0.1"); // 本机测试地址
char sendbuf[BUFSIZ] = { 0 };
char recvbuf[BUFSIZ] = { 0 };
while (true)
{
// 发送消息
printf("send>");
memset(sendbuf, 0, sizeof(sendbuf));
gets_s(sendbuf, BUFSIZ);
if (SOCKET_ERROR == send(fd, sendbuf, strlen(sendbuf), 0))
{
err("send");
}
// recv从指定的socket接收消息
if (0 < recv(fd, recvbuf, BUFSIZ, 0))
{
printf("recv:%s
", recvbuf);
memset(recvbuf, 0, sizeof(recvbuf));
}
}
// 关闭
closesocket(fd);
close_Socket();
printf("client----------end----------
");
getchar();
return 0;
}
总结
在VS平台上,用于TCPIP通讯的C++代码
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。