SERVER端
代码:
#include <Winsock2.h>
#include <iostream>
using namespace std;
void main()
{
/*
1.加载套接字库函数WSAstartup ,
加载套接字库,进行套接字库的版本协商。
有两个参数,第一个是WORD,用来指定版本号。
第二个参数是返回值,指向WSAData结构体的指针,接收windows sockets实现的详细的细节
*/
WORD wVersionRequested;//定义WORD类型变量
WSADATA wsaData;//WORD类型,用于指定准备加载的winsock库的版本,可用MAKEWORD(x,y)方便的获得wVersionRequested的正确值。x高字节副版本,y低字节主版本
int err;
/*
补充:
WSADATA结构体定义如下:`在这里插入代码片`
typedef struct WSAData{
WORD wVersion;//低字节主版本
WORD wHighVersion;//高字节副版本
char szDescription [WSADECRIPTION_LEN+1];//没用
char szSystemStatus[WSASYS_STATUS_LEN+1];//没用
unsigned short iMaxSockets;//不可使用
unsigned short iMaxLdpDg;//不可使用
char FAR*lpVendorInfo;//没有用到
}WSADATA,*LPWSADATA;
对于每一个WSAStartup的成功调用(成功加载winsock.DLL后),在最后都对应一个WSACleanup调用,以便释放为该应用程序分配的资源。
*/
wVersionRequested=MAKEWORD(1,1);//MAKEWORD宏,请求1.1版本的winsock库
err=WSAStartup(wVersionRequested,&wsaData);//&wsaData指向WSADATA的指针,WSAStartup用其加载的库版本的相关信息填写在这个结构中。(后来程序出错,1.1版本不行了,换成2.2可以)
if(err!=0){
return;
}
//判断返回的wVerion值低字节是否为1和高字节是否为1,如果不是请求的winsock 1.1版本,程序调用WSACleanup(),终止对winsock库的使用,然后返回。
if(LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wHighVersion)!=1){
WSACleanup();
return;
}
/*2.创建套接字
SOCKET socket(int af,int type,int protocol);
socket类型返回套接字的描述符,这个类型实际上指定的是一个整型。
该函数接收三个参数。
af:指定地址族,对于TCP/IP协议的套接字,它只能是AF_INET(也可以写成PF_INET).
type:socket类型,对于1.1版本的socket,只支持两种类型的套接字:SOCK_STREAM 指定产生流式套接字
SOCK_RGRAM产生数据报套接字
protocol:与特定的地址家族相关的协议,如果指定为0,那么它就会根据地址格式和套接字类别,自动为你选一个合适的协议。
返回值:函数调用成功,返回一个新的SOCKET数据类型的套接字描述符。
失败,返回一个INVALID_SOCKET,错误信息可以通过WSAGetLastError函数返回