C/C++ TCP winsock socket套接字/消息互传

本文介绍了一个使用C/C++和Winsock实现的TCP客户端与服务器端通信的示例程序。该程序展示了如何创建套接字、绑定端口、监听连接请求以及收发消息等基本操作。

C/C++ TCP winsock socket套接字/消息互传

—-server端代码

//server
#include <iostream>
#include <stdio.h>
#include <WinSock2.h>
#include <time.h>

using namespace std;

#pragma comment(lib, "ws2_32.lib")

#define buf 1460

void systime();

int main(int argc, char* argv[])
{
    WSADATA wsadata;
    int RWSU = WSAStartup(MAKEWORD(2, 2), &wsadata);
    if (RWSU != 0)
    {
        cout << "初始化失败" << endl;
        return 0;
    }

    //socket
    SOCKET s;
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET)
    {
        cout << "创建套接字失败" << WSAGetLastError() << endl;
        return -1;
    }


    //创建服务器端的地址结构
    struct sockaddr_in s_in;
    s_in.sin_family = AF_INET;
    s_in.sin_port = htons(5111);
    s_in.sin_addr.s_addr = htonl(INADDR_ANY);
    //sin.sin_zero[8] = 0;

    int bindResult = bind(s, (sockaddr*)&s_in, sizeof(sockaddr));

    if (bindResult != 0)
    {
        cout << "绑定套接字失败"<< WSAGetLastError()<< endl;
        return -1;
    }

    //listen()
    int listenResult = listen(s, 5);
    if (listenResult != 0)
    {
        cout << "listen error()" << WSAGetLastError() << endl;
        return -1;
    }

    SOCKET ss;
    sockaddr_in c_in;
    int addrlen = sizeof(sockaddr);
    ss = accept(s, (sockaddr*)&c_in, &addrlen);
    if (ss == INVALID_SOCKET)
    {
        cout << "accept套接字失败" << WSAGetLastError() << endl;
        return -1;
    }
    closesocket(s);
    while (true)
    {
        char recvf[buf];
        memset(recvf, 0, buf);
        int Rrecv = recv(ss, recvf, buf, 0);

        if (Rrecv == SOCKET_ERROR)
        {
            cout << "接收失败" << WSAGetLastError()<< endl;
            return -1;
        }

        SYSTEMTIME st;
        cout << "来自客户端的消息("; systime(); cout << endl;
        cout << recvf << endl;
        if (strcmp(recvf, "exit") == 0)
            break;

        cout << "请输入要发送的消息" << endl;
        char sendmessage[buf];
        memset(sendmessage, 0, sizeof(sendmessage));
        cin >> sendmessage;
        int sendResult = send(ss, sendmessage, sizeof(sendmessage), 0);
        if (sendResult == SOCKET_ERROR)
        {
            cout << "server 发送失败" << WSAGetLastError() << endl;
            return -1;
        }
        else 
            cout << "消息成功发送("; systime(); cout << endl;
        if (strcmp(sendmessage, "exit") == 0)
            break;
    }
    Sleep(1000);
    int RClo = closesocket(ss);
    if (RClo != 0)
    {
        cout << "close socket error" << WSAGetLastError() << endl;
        return 0;
    }

    //WSACleanup();
    int RWCU = WSACleanup();
    if (RWCU != 0)
    {
        cout << "注销失败" << WSAGetLastError() << endl;
        return 0;
    }
    return 0;
}

void systime()
{
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    cout << asctime(timeinfo);
}

—-cilent客户端代码

//cilent
#include <iostream>
#include <Winsock2.h>
#include <stdio.h>
#include <time.h>

using namespace std;

#pragma comment(lib, "ws2_32.lib")

#define buf 1460

void systime();

int main()
{
    char send_message[buf];
    memset(send_message, 0, buf);

    //初始化winsock
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2, 2), &wsadata);
    int RWSU = WSAStartup(MAKEWORD(2, 2), &wsadata);
    if (RWSU != 0)
    {
        cout << "初始化失败" << endl;
        return 0;
    }

    //创建SOCKET
    SOCKET s;
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET)
    {
        cout << "创建套接字失败" << WSAGetLastError() << endl;
        return -1;
    }

    //IP地址,填写要链接的服务器的地址
    //const char FAR* cp = "127.0.0.1";
    struct sockaddr_in s_in;
    s_in.sin_family = AF_INET;
    s_in.sin_port = htons(5111);
    s_in.sin_addr.s_addr = inet_addr("127.0.0.1");

    //connect
    int connectResult = connect(s, (struct sockaddr*)&s_in, sizeof(sockaddr));
    if (connectResult != 0)
    {
        cout << "connect socket error" << WSAGetLastError() << endl;
        return -1;
    }

    while (TRUE)
    {
        cout << "请输入要发送的信息" << endl;
        cin >> send_message;

        int sendResult = send(s, send_message, sizeof(send_message), 0);
        if (sendResult == SOCKET_ERROR)
        {
            cout << "发送失败"<< WSAGetLastError() << endl;
            return -1;
        }
        cout << "信息成功发送("; systime(); cout << endl;
        if (strcmp(send_message, "exit") == 0)
            break;

        char recvmessage[buf];
        memset(recvmessage, 0, sizeof(recvmessage));
        int recvResult = recv(s, recvmessage, sizeof(recvmessage), 0);
        if (recvResult == SOCKET_ERROR)
        {
            cout << "信息接收失败" << WSAGetLastError() << endl;
            return -1;
        }
        else
        {
            cout << "来自服务器端的消息("; systime(); cout << endl;
            cout << recvmessage << endl;
        }
        if (strcmp(recvmessage, "exit") == 0)
            break;

    }
    Sleep(1000);

    //close
    int RClo = closesocket(s);
    if (RClo != 0)
    {
        cout << "close socket error" << WSAGetLastError() << endl;
        return -1;
    }
    //WSACleanup()
    int RWCU = WSACleanup();
    if (RWCU != 0)
    {
        cout << "注销失败" << WSAGetLastError() << endl;
        return -1;
    }
    return 0;
}

void systime()
{
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    cout << asctime(timeinfo);
}

运行截图
首先打开服务器端,再打开客户端

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tailor_long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值