服务器端:

//第二版本的winsock 库
#include <winsock2.h>
//ws2_32.lib静态库
//ws2_32.dll动态链接库
#pragma comment (lib,"ws2_32")

//指针的概念,指针的使用方式。一些符号的含义。
//主函数引用了两个参数,这个地方是有问题的
int main(int argc,char* argv[])//这两个参数有什么用呢?
{    //定义一个结构体类型的变量进行存放“windows sockets”初始化信息。
   //结构体中包含的成员数据为,wVersion动态链接库规范的信息
   //wHighVersion动态链接库最大支持的windows sockets规范的信息
   //结构体包含很多内容....此处略过...
   WSADATA wsaData;
   //初始化动态链接库,并且使用函数“MAKEWORD”合并短整数函数
   WSAStartup(MAKEWORD(2,2),&wsaData);
   //创建套接字,通信协议为“PF_INET”TCP/IP协议族。
   //套接字的类型为“SOCK_STREAM”流套接字类型。
   //所使用的协议为TCP协议
   //s:是socket()函数创建的套接字描述符,该函数返回值是一个新创建的类型为SOCKET的套接字的描述符。
   SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
   //定义IP地址和端口号等信息的结构体
   sockaddr_in sockaddr;
   //成员变量sin_family为:PF_INET
   sockaddr.sin_family = PF_INET;
   //在结构体中保存网卡ip地址!这个ip地址是监听的ip地址吗?
   sockaddr.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");
   //监听端口为827
   sockaddr.sin_port = htons(827);
   //绑定IP地址和端口号
   bind(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));
   //监听端口,使得套接字s处于监听状态。为处于监听状态状态的流套接字s维护一个客户连接请求队列
   listen(s,1);
   //定义sockaddr的结构体
   SOCKADDR clientAddr;
   //提取SOCKADDR的长度
   int nSize = sizeof(SOCKADDR);
   //创建套接字
   SOCKET clientSock;
   //服务器程序调用accept函数从处于监听状态的流套接字的客户端请求队列中取出第一个请求,
   //并创建一个新的套接字和客户端进行连接通信。
   clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);
   //基于TCP的发送函数,clientSock指定发送端套接字描述符
   send(clientSock,
       //指明一个存放应用程序要发送数据的缓冲区
       "hello client \r\n",
       //指明实际要发送到数据的字节数
       strlen("hello client \r\n") + sizeof(char),
       //标记为一般设置为“0”
       NULL);
   //关闭套接字“clientSock”
   closesocket(clientSock);
   //关闭套接字“s”
   closesocket(s);
   //释放动态链接库
   WSACleanup();
   return 0;
}


客户端:

#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32")

//依旧不明白主函数中的两个变量使用来干什么的。
int main(int argc,char* argv[])
{
   //生命用于存储动态链接库的初始化数据信息的变量
   WSADATA    wsaData;
   //使用函数执行动态链接库执行初始化工作
   WSAStartup(MAKEWORD(2,2),&wsaData);
   //新建tcp类型的套接字变量
   SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
   //新建端口,IP信息的存放结构体
   sockaddr_in sockAddr;
   //在结构体中存储的信息是使用TCP协议进行连接
   sockAddr.sin_family = PF_INET;
   //指定结构体中存放的目标IP
   sockAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.143");
   //指定目标端口
   sockAddr.sin_port = htons(827);
   //连接指定的端口和IP,协议,进行连接
   //#########################################################
   //下面这句话我不是很理解,有哪位大神可以帮助解释下!??????????
   //#########################################################
   connect(s,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));
   //初始化字符串变量的值为“0”
   char szBuffer[MAXBYTE] = { 0 };
   //指定接收端套接字描述符“s”,指定一个缓冲区,用来存放接收到的数据,标记为空。
   recv(s,szBuffer,MAXBYTE,NULL);
   //输出字符串类型变量的内容。
   printf("szBuffer = %s \r\n ",szBuffer);
   //关闭套接字“s”
   closesocket(s);
   //释放动态加链接库
   WSACleanup();
   return 0;
}

编译后成功通讯如下图所示
211204772.jpg