C++实现服务器端与客户端TCP连接(自用)

服务器端:

#include <iostream>
using namespace std;
#include <winsock2.h>
#pragma comment(lib,"Ws2_32.lib")

const int BUF_SIZE = 2048;            //缓冲区大小
char sendbuf[BUF_SIZE];        //发送缓冲区
char recvbuf[BUF_SIZE];        //接受缓冲区

void initialization()
{
    //WSADATA是一种数据结构,用来存储被WSAStartup函数调用后返回的Windows sockets数据,包含Winsock.dll执行的数据。需要头文件
    WSADATA wsadata;
    //MAKEWORD声明调用不同的Winsock版本。例如MAKEWORD(2,2)就是调用2.2版
    WORD wsaversion = MAKEWORD(2, 2);
    //WSAStartup函数必须是应用程序或DLL调用的第一个Windows套接字函数
    //可以进行初始化操作,检测winsock版本与调用dll是否一致,成功返回0
    if (WSAStartup(wsaversion, &wsadata) != 0)
    {
        cout << "载入socket库失败" << endl;
    }
    else {
        cout << "初始化成功" << endl;
    }

}

int main()
{
    SOCKET sockSer;    //创建服务器套接字
    SOCKET sockCli;

    //SOCKADDR_IN是系统封装的一个结构体,具体包含了成员变量:sin_family、sin_addr、sin_zero
    SOCKADDR_IN addrSer;
    SOCKADDR_IN addrCli;


    initialization();


    //socket(int domain, int type, int protocol)
    //domain表示要使用的协议AF_INET指ipv4,type指套接字类型 stream指tcp
    //协议“protocol”一般设置为“0”,就是说在已经确定套接字使用的协议簇和类型时,这个参数的值就为0。
    sockSer = socket(AF_INET, SOCK_STREAM, 0);


    //初始化地址包
    //sin_addr主要用来保存IP地址信息
    //htonl 函数可用于将主机字节顺序中的 IPv4 地址转换为网络字节顺序中的 IPv4 地址。
    addrSer.sin_addr.s_addr = htonl(INADDR_ANY);
    //sin_family主要用来定义是哪种地址族
    addrSer.sin_family = AF_INET;
    //sin_port主要用来保存端口号
    addrSer.sin_port = htons(8000);

    // 在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。
    if (bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
        cout << "套接字绑定失败";
        //调用 WSACleanup 时,将取消此过程中任何线程发出的挂起阻止或异步 Windows 套接字调用,
        //而无需发布任何通知消息,也不发出任何事件对象的信号。
        WSACleanup();
    }
    else {
        cout << "绑定套接字成功" << endl;
    }

    //设置监听
    cout << "开始连接" << endl;
    //等待连接最大 0x7fffffff 即32位最大值,成功返回0,失败失败返回SOCKET_ERROR
    if (listen(sockSer, SOMAXCONN) != 0) {
        cout << "监听失败!";
        WSACleanup();
    }
    cout << "监听成功" << endl;


    //接受连接:
    //accept将客户端的信息绑定到一个socket上,
    //也就是给客户端创建一个socket,通过返回值返回给我们客户端的socket
    int addrlen = sizeof(SOCKADDR);
    sockCli = accept(sockSer, (SOCKADDR*)&addrCli, &addrlen);
    if (sockCli == SOCKET_ERROR) {
        cout << "接受连接失败!" << endl;
        WSACleanup();
        return 0;
    }


    cout << "连接建立,准备接受数据" << endl;
    while (true)
    {
        if (recv(sockCli, recvbuf, sizeof(recvbuf), 0) == -1) {
            cout << "接受失败!" << endl;
            break;
        }
        else {
            cout << "客户端消息:" << recvbuf << endl;
        }

        cout << "请输入回复信息:" << endl;
        cin >> sendbuf;
        if (send(sockCli, sendbuf, sizeof(sendbuf), 0) == SOCKET_ERROR)
        {
            cout << "发送失败!" << endl;
            break;
        }
    }

    closesocket(sockSer);
    closesocket(sockCli);
    WSACleanup();
    return 0;


}
 

客户端:

#include <iostream>
using namespace std;
#include <winsock2.h>
#include <WS2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")

const int BUF_SIZE = 2048;            //创建缓冲区
char sendbuf[BUF_SIZE];        //发送缓冲区
char recvbuf[BUF_SIZE];        //接受缓冲区

void initialization()
{
    //初始化
    WSADATA wsadata;
    WORD wsaversion = MAKEWORD(2, 2);

    if (WSAStartup(wsaversion, &wsadata) != 0)//版本一致则返0
    {
        cout << "载入socket库失败" << endl;
    }
    else {
        cout << "初始化成功" << endl;
    }

}

int main()
{
    SOCKET sockCli;    //创建服务器套接字

    //SOCKADDR_IN是系统封装的一个结构体,具体包含了成员变量:sin_family、sin_addr、sin_zero
    SOCKADDR_IN addrSer;

    initialization();

    //创建套接字
    sockCli = socket(AF_INET, SOCK_STREAM, 0);


    //初始化地址包
    //addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    inet_pton(AF_INET, "127.0.0.1", &addrSer.sin_addr.s_addr);
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(8000);

    // 在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。
    if (connect(sockCli, (SOCKADDR*)&addrSer, sizeof(addrSer)) == SOCKET_ERROR)
    {
        cout << "服务器连接失败" << endl;
        WSACleanup();
    }
    else {
        cout << "服务器连接成功" << endl;
    }


    //接受数据:
    while (true)
    {
        cout << "请输入发送信息:" << endl;
        cin >> sendbuf;
        int sendlen = send(sockCli, sendbuf, sizeof(sendbuf), 0);
        if (sendlen < 0) {
            cout << "发送失败!" << endl;
            break;
        }


        int recvlen = recv(sockCli, recvbuf, sizeof(sendbuf), 0);

        if (recvlen < 0) {
            cout << "接受失败!" << endl;
            break;
        }
        else {
            cout << "服务端信息:" << recvbuf << endl;
        }

    }

    closesocket(sockCli);
    WSACleanup();
    return 0;
}
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个基本的TCP客户服务器通信的C代码实现服务器: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> int main() { int server_socket, client_socket; struct sockaddr_in server_addr, client_addr; char buffer[1024]; int bytes_received, bytes_sent; socklen_t client_addr_len; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8888); server_addr.sin_addr.s_addr = INADDR_ANY; server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket < 0) { perror("socket"); exit(1); } if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); exit(1); } if (listen(server_socket, 5) < 0) { perror("listen"); exit(1); } printf("Server started...\n"); while (1) { client_addr_len = sizeof(client_addr); client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len); if (client_socket < 0) { perror("accept"); exit(1); } printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); while (1) { memset(buffer, 0, sizeof(buffer)); bytes_received = recv(client_socket, buffer, sizeof(buffer), 0); if (bytes_received < 0) { perror("recv"); exit(1); } else if (bytes_received == 0) { printf("Client disconnected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); break; } printf("Received from client: %s", buffer); bytes_sent = send(client_socket, buffer, bytes_received, 0); if (bytes_sent < 0) { perror("send"); exit(1); } } close(client_socket); } close(server_socket); return 0; } ``` 客户: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <unistd.h> int main() { int client_socket; struct sockaddr_in server_addr; struct hostent *server; char buffer[1024]; int bytes_received, bytes_sent; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8888); server = gethostbyname("localhost"); if (server == NULL) { fprintf(stderr, "Error: no such host\n"); exit(1); } memcpy(&server_addr.sin_addr.s_addr, server->h_addr, server->h_length); client_socket = socket(AF_INET, SOCK_STREAM, 0); if (client_socket < 0) { perror("socket"); exit(1); } if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); exit(1); } printf("Connected to server: %s:%d\n", inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port)); while (1) { memset(buffer, 0, sizeof(buffer)); printf("Enter message: "); fgets(buffer, sizeof(buffer), stdin); bytes_sent = send(client_socket, buffer, strlen(buffer), 0); if (bytes_sent < 0) { perror("send"); exit(1); } bytes_received = recv(client_socket, buffer, sizeof(buffer), 0); if (bytes_received < 0) { perror("recv"); exit(1); } else if (bytes_received == 0) { printf("Server disconnected\n"); break; } printf("Received from server: %s", buffer); } close(client_socket); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值