超级详细的客户端服务器简单通信

**

超级详细的客户端服务器简单通信

**

面向连接的应用程序流程图
通信流程图

//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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值