利用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_STREAM, 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));
//第四步,设置为监听模式,用于接收客户请求
listen(sockSrv, 5);
SOCKADDR_IN addrClient; //存放
int len = sizeof(SOCKADDR);
while (1)
{
//第五步:建立连接请求
//返回的套接字用来向客户端发送数据
SOCKET sockConn = accept(sockSrv, (SOCKADDR *)&addrClient,&len);
//第六步:接收和发送数据
//发送数据
char sendbuf[]="1111111111";
send(sockConn, sendbuf, 11, 0);
char sendbuf1[] = "2222222222";
send(sockConn, sendbuf1,11, 0);
//接收数据
char recvBuf[11];
recv(sockConn, recvBuf, 11, 0);
char recvBuf1[11];
recv(sockConn, recvBuf1, 11, 0);
//打印接收的数据
cout << recvBuf << endl;
cout << recvBuf1<< endl;
//第七步:关闭套接字
closesocket(sockConn); //关闭新形成的套接字
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;
}
while (1)
{
//第二步:创建用于流式套接字(TCP协议使用的流式套接字)
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 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);
connect(sockSrv, (SOCKADDR*)&addrSrv, sizeof(addrSrv));
//第四步:接收和发送数据
//发送的数据
char sendbuf[] = "客户端1111";
char sendbuf1[] = "客户端2222";
send(sockSrv, sendbuf, strlen(sendbuf)+1, 0);
send(sockSrv, sendbuf1, strlen(sendbuf1)+1,0);
//接收数据
char recvBuf[100];
recv(sockSrv, recvBuf, 11, 0);
char recvBuf1[100];
recv(sockSrv, recvBuf1, 11, 0);
cout << recvBuf << endl;
cout << recvBuf1 << endl;
Sleep(500);
//第五步:关闭套接字
closesocket(sockSrv); //关闭套接字
}
// WSACleanup(); //终止对套接字库的使用
}