基于TCP(面向连接)的socket编程

说明:

本程序是基于windows socket的套接字库实现网络编程;
当WSAStartup函数调用成功后,在程序的最后都需要相应的调用WSACleanup函数
以便释放为该应用程序分配的资源,终止对WinSock动态库的使用。


基于TCP的服务器端流程
  1. 创建套接字(socket);
  2. 将socket绑定本地地址和端口号(bind);
  3. 将 socket设置为监听模式,准备接收客户端请求(listen);
  4. 等待客户请求到来;当请求到来后,返回一个新的对应于此次连接的socket(accept);
  5. 用返回的socket和客户端进行通信(send/recv);
  6. 返回,等待另一个客户请求;
  7. 关闭socket;

服务器端流程:
TCP服务器端

代码如下:

// TCPSrv.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //加载套接字库
    WORD wVersionRequested;
    WSADATA wsaData = {0};
    wVersionRequested = MAKEWORD(1,1);

    if (WSAStartup(wVersionRequested, &wsaData) != 0 ) 
    {
        return 1;
    }

    if (LOBYTE(wsaData.wVersion) != 1 ||
        HIBYTE(wsaData.wVersion) != 1) 
    {
        WSACleanup( );
        return 1; 
    }

    //The WinSock DLL is acceptable.

    //创建用于监听的套接字,拥有地址族 但是没有名字:地址族+地址+端口号
    SOCKET socketSrv = socket(AF_INET, SOCK_STREAM,0);

    //创建服务器端名字信息
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//地址
    addrSrv.sin_family = AF_INET;//地址族
    addrSrv.sin_port = htons(6000);//端口号

    //将名字和套接字绑定在一起
    bind(socketSrv,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR_IN));

    //将套接字设为监听模式,准备接收客户请求
    listen(socketSrv,SOMAXCONN);

    SOCKADDR_IN addrClient;
    int len = sizeof(SOCKADDR);

    while (1)
    {
        //accpet会阻塞,直到client端调用connect
        SOCKET sockConn = accept(socketSrv,(SOCKADDR*)&addrClient,&len);

        //发送数据
        char sendBuf[100] = {"this is server."};
        send(sockConn,sendBuf, strlen(sendBuf),0);

        //接收数据
        char recvBuf[100] = {0};
        recv(sockConn,recvBuf,sizeof(char)*100,0/*一般设置为0*/);

        //打印接收数据
        printf("recv data:%s\n",recvBuf);

        //关闭套接字
        closesocket(sockConn); 
    }

    //关闭监听套接字
    closesocket(socketSrv); 

    //清理套接字库的使用
    WSACleanup();
    return 0;
}
基于TCP的客户端流程
  1. 创建套接字(socket);
  2. 向服务器发起请求(connect);
  3. 和服务器进行通信(send/recv);
  4. 关闭套接字;

客户端端流程:
这里写图片描述

代码如下:

// TcpClient.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //加载套接字库
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 1, 1 );

    err = WSAStartup(wVersionRequested, &wsaData);
    if ( err != 0 ) 
    {
        return 1;
    }

    if (LOBYTE(wsaData.wVersion) != 1 
        ||HIBYTE(wsaData.wVersion) != 1)
    {
        WSACleanup();
        return -1;
    }

    //创建客户端的套接字
    SOCKET sockClient = socket(AF_INET,SOCK_STREAM, 0/*自动选择协议*/);

    //设定服务器端地址和端口
    SOCKADDR_IN addrSrv;

    //客户端和服务器均在一台电脑上
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
    addrSrv.sin_family = AF_INET;
    //和服务器的端口号一致
    addrSrv.sin_port = htons(6000);

    //向服务器发送请求
    connect(sockClient, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

    //接收数据
    char recvBuf[100] = {0};
    recv(sockClient,(char*)recvBuf,sizeof(char)*100,0);
    printf("recv data:%s\n", recvBuf);

    //发送数据
    char sendBuf[100]= {"this is client."};                      
    send(sockClient,sendBuf,strlen(sendBuf),0);

    //关闭套接字,释放和套接字相关的资源
    closesocket(sockClient);

    //终止对套接字库的使用
    WSACleanup();

    system("pause");
    return 0;
}

测试结果:

可以有多个客户端可以向服务器端发起请求,服务器一个个接收请求;

这里写图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值