**
超级详细的客户端服务器简单通信
**
通信流程图
//Service端
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32") //Windows Sockets应用程序接口
using namespace std;
#define maxLen 4096 //最大字段长度
enum {PORT=19111}; //选择较大的端口号即可
int main(){
WSADATA wd; //用来存储被WSAStartup函数调用后返回的Windows Sockets数据
WSAStartup(0x0202, &wd); //完成Winsock服务的初始化
//socket根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源
//建立socket通信描述符并返回
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
//指明地址信息 AF_INET:IPv4 网络协议的套接字类型
//htons()将整型变量从主机字节顺序转变成网络字节顺序
sockaddr_in sa = { AF_INET, htons(PORT) };
//将套接字与机器上一定的端口关联
int n = bind(sock, (sockaddr*)&sa, sizeof(sa));
if (n < 0){ //返回值小于0出错
cout << GetLastError() << endl;
return -1;
}
//创建一个套接口并监听申请的连接.
//5:等待连接队列的最大长度。
listen(sock, 5);
int nLen = sizeof(sa);
while (true){
//接受连接,一旦有客户端发出连接,accept返回客户地址信息和一个新的socket,根据这个socket双方就可以开始收发数据
SOCKET socka = accept(sock, (sockaddr*)&sa, &nLen);
while (true){
char buf[maxLen]; //缓存区
//从一个套接口接收数据并缓存到buf中,返回数据长度
n = recv(socka, buf, sizeof(buf), 0);
if (n <= 0) //出错终止
break;
buf[n] = 0; //尾部添加结束符
cout << buf << endl; ///输出
}
}
return 0;
}
//Client端
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32")
using namespace std;
#define maxLen 4096
enum { PORT = 19111 };
int main(){
WSADATA wd;
WSAStartup(0x0202, &wd);
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in sa = { AF_INET, htons(PORT) };
//127.0.0.1 回环地址,设置服务器端的IP地址
//inet_addr() 把一个IP地址格式“A.B.C.D”转换成32bit的网络字节顺序
sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//用于建立与指定socket的连接。
int n = connect(sock, (sockaddr*)&sa, sizeof(sa));
if (n < 0){
cout << GetLastError() << endl;
return -1;
}
char buf[maxLen];
while (true){
cout << "请输入你要发送的文字【#退出】:";
cin >> buf;
//向一个已经连接的socket发送数据
send(sock, buf, strlen(buf), 0);
if (buf[0] == '#')
break;
}
return 0;
}
[测试数据](http://img.blog.csdn.net/20171031112417466?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbml1MTUyNzMxMjIyOTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)