利用vs2013进行网络编程时,若提示没法解析的外部命令,可能是没有去链接ws2_32.lib库文件。
解决方法:项目—〉属性-〉链接器->输入->附加依赖项,在其中填入ws2_32.lib
服务器端:
#include<Winsock2.h> //因为使用到winSock库中的函数
#include<stdio.h>
#include<iostream>
#include <windows.h>
using namespace std;
void main()
{
// 第一步 :加载套接字库
WORD wVersionRequested = MAKEWORD(1, 1);; // 准备加载的版本 如 2.1:表示主版本号是2
WSADATA wsaData; //存放系统打算加载的版本号 以及 套接字库中的最高版本
int err = WSAStartup(wVersionRequested, &wsaData); //加载成功则返回0
if (err != 0)
{
cout << "加载套接库失败" << endl;
return;
}
//如果系统打算的使用的套接字库的 主版本号不为1 或者 副版本号不为1
//也就是说 如果系统打算加载的版本不是 1.1,那么终止对套接字库的使用
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup(); //终止对套接字库的使用
return;
}
//第二步:创建数据报式套接字(TCP协议使用的流式套接字)
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0); //第一个参数和第三个参数不用关心
//第三步:将套接字绑定到 本地地址 和 端口上
SOCKADDR_IN addrSrv; //用来存放本地地址 和 端口 的结构体
addrSrv.sin_family = AF_INET; //固定的,不用管
//htonl是将unsigned long转化为网络字节顺序
//INADDR_ANY 表示是本机的IP
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //绑定服务器的IP地址
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
SOCKADDR_IN addrClient; //存放
int len = sizeof(SOCKADDR);
while (1)
{
//第五步 收发数据
//接收数据
char recvBuf[11];
recvfrom(sockSrv, recvBuf, 11, 0, (SOCKADDR *)&addrClient,&len);
//打印接收的数据
cout << recvBuf << endl;
char sendbuf[] = "1111111111";
sendto(sockSrv, sendbuf, strlen(sendbuf) + 1, 0, (SOCKADDR *)&addrClient, sizeof(SOCKADDR));
//第六步:关闭套接字
closesocket(sockSrv); //关闭新形成的套接字
Sleep(500);
}
}
客户端:
#include<Winsock2.h> //因为使用到winSock库中的函数
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include<iostream>
using namespace std;
void main()
{
// 第一步 :加载套接字库
WORD wVersionRequested = MAKEWORD(1, 1);; // 准备加载的版本 如 2.1:表示主版本号是2
WSADATA wsaData; //存放系统打算加载的版本号 以及 套接字库中的最高版本
int err = WSAStartup(wVersionRequested, &wsaData); //加载成功则返回0
if (err != 0)
{
cout << "加载套接库失败" << endl;
return;
}
//如果系统打算的使用的套接字库的 主版本号不为1 或者 副版本号不为1
//也就是说 如果系统打算加载的版本不是 1.1,那么终止对套接字库的使用
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup(); //终止对套接字库的使用
return;
}
int len = sizeof(SOCKADDR);
//第二步:创建用于流式套接字(TCP协议使用的流式套接字)
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0); //第一个参数和第三个参数不用关心
//第三步:用套接字向服务器发送连接请求
SOCKADDR_IN addrSrv; //用来存放本地地址 和 端口 的结构体
addrSrv.sin_family = AF_INET; //固定的,不用管
//htonl是将unsigned long转化为网络字节顺序
//INADDR_ANY 表示是本机的IP
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //绑定服务器的IP地址
addrSrv.sin_port = htons(6000);
while (1)
{
//第四步:接收和发送数据
//发送的数据
char sendbuf[] = "客户端1111";
sendto(sockSrv, sendbuf, 11, 0, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
//接收数据
char recvBuf[11];
recvfrom(sockSrv, recvBuf, 11, 0, (SOCKADDR *)&addrSrv, &len);
Sleep(500);
cout << recvBuf << endl;
}
//第五步:关闭套接字
closesocket(sockSrv); //关闭套接字
// WSACleanup(); //终止对套接字库的使用
}