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

news/2024/5/17 15:14:15 标签: tcp, socket-网络

tcp-winsock-socket套接字消息互传">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);
}

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


http://www.niftyadmin.cn/n/780671.html

相关文章

隐马尔科夫的三个基本问题

隐马尔科夫的三个基本问题 概率计算问题 根据已知的HMM模型&#xff0c;计算在模型下观测序列产生的概率P(O|人)学习问题 根据已知的观测序列O来估计HMM参数&#xff1a;人 (A,B, Pi) 相当于训练模型的问题&#xff0c;是的在该参数下&#xff0c;已知的观测序列产生的概率…

硬件复位、软件复位、上电复位的异同

硬件复位顾名思义通过硬件给系统一个复位,比如在电路板上设计一复位电路,通 过按下按键就可以给系统实现一个复位,而无论系统在执行什么样的程序复位启动以后需要重新加载加载FPGA、DSP等&#xff0c;也有可能在这个操作之前初始化化CPU&#xff0c;加载系统文件等操作&#xf…

VS2015下C语言连接mysql数据库问题

1. 项目》右键》属性》VC 目录 添加mysql的include 和 lib路径 运行程序 // cgi_select.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <Windows.h> #include <mysql.h> #pragma comment(lib,"libmysql.lib")MYSQL my…

GetLastError返回值列表参考

文章来源 GetLastError()返回值列表:〖0〗-操作成功完成。 〖1〗-功能错误。 〖2〗-系统找不到指定的文件。 〖3〗-系统找不到指定的路径。 〖4〗-系统无法打开文件。 〖5〗-拒绝访问。 〖6〗-句柄无效。 〖7〗-存储控制块被损坏。 〖8〗-存储空间不足&#xff0c;无法处理此命…

(VC++)cl/nmake编译器系统环境变量配置

基于VC&#xff08;VS2015&#xff09;的编译器环境变量配置&#xff0c;使得在Windows power shell/CMD环境下通过cl/nmake命令直接编译运行c程序 这里我们需要设置&#xff1a;PATH, LIB, INCLUDE 三个环境变量 1. PATH路径追加&#xff1a; C:\Program Files (x86)\Micro…

完全数(Perfect number)

1010.完全数(Perfect number) 时限&#xff1a;2000ms 内存限制&#xff1a;10000K 总时限&#xff1a;3000ms 描述如果一个大于2的整数的不包含它自身的约数&#xff08;即能将其整除的数&#xff09;之和恰好等于它本身&#xff0c;则称其为完全数。如&#xff1a;6&#x…

判素数(Prime number)

1011.判素数(Prime number) 时限&#xff1a;100ms 内存限制&#xff1a;10000K 总时限&#xff1a;1000ms 描述给出一个数n&#xff08;2<n<10000&#xff09;&#xff0c;判定它是否为素数。 素数&#xff1a;一个大于等于2的数&#xff0c;除了1和它本身&#xff0c…

素数表(Prime number table)

1019.素数表(Prime number table) 时限&#xff1a;1000ms 内存限制&#xff1a;10000K 总时限&#xff1a;3000ms 描述输出素数表(Output prime number table)输入输入两个正整数m n(其中1< m < n < 100000000&#xff0c;且 n-m < 10000)。Input two positive …