Socket通信小例子

本文出处

作者:吴秦

链接:http://www.cnblogs.com/skynet/

转自:https://blog.csdn.net/dlutbrucezhang/article/details/8577810

InitSock.h

#pragma once

#include <WinSock2.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#pragma comment(lib, "WS2_32")

class CInitSock
{
public:
    CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
    {
        //初始化WS_32.dll
        WSADATA wsaData;
        WORD sockVersion = MAKEWORD(minorVer, majorVer);
        if (::WSAStartup(sockVersion, &wsaData) != 0)
        {
            exit(0);
        }
    }
    ~CInitSock()
    {
        ::WSACleanup();
    }

private:

};

server.cpp

#include "InitSock.h"
#include <stdio.h>
#include <iostream>

using namespace std;
CInitSock initSock; 

int main()
{
    //创建监听套接字
    SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (sListen == INVALID_SOCKET)
    {
        cout << "Failed socket()" << endl;
        return 0;
    }

    //绑定监听套接字到一个本地地址
    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(4567);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;

    if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        cout << "Failed bind()" << endl;
        return 0;
    }

    //进入监听模式
    if (::listen(sListen, 2) == SOCKET_ERROR)
    {
        cout << "Failed listen()" << endl;
        return 0;
    }

    sockaddr_in remoteAddr;
    int nAddrLen = sizeof(remoteAddr);
    SOCKET sConn = 0;
    char szText[] = "TCP Server Demo! \r\n";

    while (sConn == 0)
    {
        sConn = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); //accept 返回的是一个已连接套接字
        if (sConn == INVALID_SOCKET)
        {
            cout << "Failed accept()" << endl;
        }

        cout << "receive a connection:" << inet_ntoa(remoteAddr.sin_addr) << endl;
        continue;
    }

    while (1)
    {
        gets_s(szText);
        ::send(sConn, szText, strlen(szText), 0);

        char buff[256];
        int nRecv = ::recv(sConn, buff, 256, 0);
        if (nRecv > 0)
        {
            buff[nRecv] = '\0';
            cout << "the recv data:" << buff << endl;
        }
    }

    ::closesocket(sConn);

    ::closesocket(sListen);

    return 0;
}

client.cpp

#include "InitSock.h"
#include <stdio.h>
#include <iostream>

using namespace std;
CInitSock initSock;

int main()
{
    SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        cout << "Failed socket()" << endl;
        return 0;
    }

    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(4567);
    serverAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    if (::connect(s, (sockaddr*)&serverAddr, sizeof(serverAddr)) == -1)
    {
        cout << "Failed connect()" << endl;
        return 0;
    }

    char buff[256];
    char szText[256];

    while (1)
    {
        int nRecv = ::recv(s, buff, 256, 0);
        if (nRecv > 0)
        {
            buff[nRecv] = '\0';
            cout << "the recv data:" << buff << endl;
        }

        gets_s(szText);
        szText[255] = '\0';
        ::send(s, szText, strlen(szText), 0);
    }

    ::closesocket(s);

    return 0;
}

  

posted @ 2019-02-12 14:16  那一剑的風情  阅读(533)  评论(0)    收藏  举报