C++ TCP服务器

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

#include "stdafx.h"
#include <iostream>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

void initialzation();

int main() {
    int send_len = 0;
    int recv_len = 0;
    int len = 0;
    char send_buf[100];
    char recv_buf[100];
    SOCKET s_server;
    SOCKET s_accept;
    SOCKADDR_IN server_addr;
    SOCKADDR_IN accept_addr;
    initialzation();
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  // 设置服务器的IP
    server_addr.sin_port = htons(8080);   // 设置服务器的端口 
    //server_addr.sin_addr.s_addr = inet_addr("192.168.0.122");

        s_server = socket(AF_INET, SOCK_STREAM, 0);
        if(bind(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR){  // 绑定IP和端口
            cout << "套接字绑定失败!" << endl;
            WSACleanup();
        }
        else{
            std::cout << "套接字绑定成功!" << std::endl;
        }

        if(listen(s_server, SOMAXCONN) < 0){    // 监听
            std::cout << "设置监听状态失败" << std::endl;
           WSACleanup();
        }
        else{
            std::cout<<"设置监听状态成功" << std::endl;
        }
        std::cout << "服务器正在监听连接, 请稍后。。。"<< std::endl;

        len = sizeof(SOCKADDR);
        s_accept = accept(s_server, (SOCKADDR *)&accept_addr, &len);  // 套接字接收连接
        if(s_accept == SOCKET_ERROR){
            std::cout << "连接客户端失败!" << std::endl;
            WSACleanup();
            return 0;
        }
        else{
            std::cout << " 连接成功, 准备接收数据!" << std::endl;
        }
        while(1){
            memset(recv_buf, 0, sizeof(recv_buf));
            recv_len = recv(s_accept, recv_buf, sizeof(recv_buf), 0);    // 接收客户端发送过来的数据
            if(recv_len < 0){
                std::cout << "接收数据失败" << std::endl;
                break;
            }
            else{
                std::cout << inet_ntoa(accept_addr.sin_addr) <<":"<<recv_buf<< endl;
            }
            std::cout << "输入回复客户端消息:";
           std::cin >> send_buf;    // 写入回复的数据
            send_len = send(s_accept, send_buf, sizeof(send_buf), 0);  // 发送数据
            if(send_len < 0){
                std::cout << "发送失败" << std::endl;
                break;
            }
        }
        closesocket(s_server);
        closesocket(s_accept);
        WSACleanup();
    return 0;
}
void initialzation() {
        WORD w_rep = MAKEWORD(2,2);
        WSADATA wsadata;
        int err;
        err = WSAStartup(w_rep, &wsadata);
        if(0 != err){
            std::cout << "初始化套接字失败!" << std::endl;
        }
        else{
            std::cout << "初始化套接字成功!" << std::endl;
        }

        if(LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2){
            std::cout << "套接字库版本号不符!" << std::endl;
            WSACleanup();
        }
        else{
            std::cout << "套接字库版本号正确!" << std::endl;
        }
}

原文链接: https://www.cnblogs.com/caozewen/p/15831010.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/187034

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午11:13
下一篇 2023年2月12日 上午11:14

相关推荐