windows下的socket编程(C++代码实现)

仅针对于小白在windows下的socket编程,(大佬请忽视),在自己的机器上亲测是成功的(WIN10环境 VS2013),先贴上一份演示效果:
演示成果

首先得明白 如何使用 socket 编程中常用的方法:
推荐博文:C++ socket编程

建议看完上述博文后再来使用整篇代码:


Sever.cpp(服务端的代码)

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

int main(int argc, char* argv[]){

    //初始化DLL
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA wsdata;
    if (WSAStartup(sockVersion, &wsdata) != 0)
    {
        return 1;
    }

    //创建套接字
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == INVALID_SOCKET)
    {
        cout << "Socket error" << endl;
        return 1;
    }


    //绑定套接字
    sockaddr_in sockAddr;
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(8888);
    sockAddr.sin_addr.S_un.S_addr = INADDR_ANY;

    if (bind(serverSocket, (sockaddr*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR){
        cout << "Bind error" << endl;
        return 1;
    }

    //开始监听
    if (listen(serverSocket, 10) == SOCKET_ERROR){
        cout << "Listen error" << endl;
        return 1;
    }


    SOCKET clientSocket;
    sockaddr_in client_sin;
    char msg[100];//存储传送的消息
    int flag = 0;//是否已经连接上
    int len = sizeof(client_sin);
    while (true){
        if (!flag)
            cout << "等待连接..." << endl;
        clientSocket = accept(serverSocket, (sockaddr*)&client_sin, &len);
        if (clientSocket == INVALID_SOCKET){
            cout << "Accept error" << endl;
            flag = 0;
            return 1;
        }
        if (!flag)
            cout << "接收到一个链接:" << inet_ntoa(client_sin.sin_addr) << endl;
        flag = 1;
        int num = recv(clientSocket, msg, 100, 0);
        if (num > 0)
        {
            msg[num] = '\0';
            cout <<"Client say: "<< msg << endl;

        }

        string data;
        getline(cin, data);
        const char * sendData;
        sendData = data.c_str();
        send(clientSocket, sendData, strlen(sendData), 0);
        closesocket(clientSocket);
    }

    closesocket(serverSocket);
    WSACleanup();



    return 0;
}



Client.cpp(客户端的代码):

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

int main()
{
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA data;
    if (WSAStartup(sockVersion, &data) != 0)
    {
        return 1;
    }

    while (true){
        SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (clientSocket == INVALID_SOCKET){
            cout << "Socket error" << endl;
            return 1;
        }
        sockaddr_in sock_in;
        sock_in.sin_family = AF_INET;
        sock_in.sin_port = htons(8888);
        sock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        if (connect(clientSocket, (sockaddr*)&sock_in, sizeof(sock_in) )== SOCKET_ERROR){
            cout << "Connect error" << endl;
            return 1;
        }

        string data;
        getline(cin, data);
        const char * msg;
        msg = data.c_str();
        send(clientSocket, msg, strlen(msg), 0);

        char revdata[100];
        int num = recv(clientSocket, revdata, 100, 0);
        if (num > 0){
            revdata[num] = '\0';
            cout <<"Sever say:"<< revdata << endl;
        }
        closesocket(clientSocket);

    }

    WSACleanup();

    return 0;
}

生成两个exe文件后,先启用sever.exe 再启动client.exe。
代码暂且只实现了每次只能单条语句通话(一人一句的来),后续会继续完善的 。


待更新。。。。。。

  • 35
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是Windows系统下C语言非阻塞模式实现面向连接的socket编程的示例代码: 1. 创建socket ```c int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { printf("Error creating socket: %d\n", WSAGetLastError()); WSACleanup(); return 1; } ``` 2. 设置非阻塞模式 ```c unsigned long mode = 1; int result = ioctlsocket(sock, FIONBIO, &mode); if (result != NO_ERROR) { printf("Error setting non-blocking mode: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } ``` 3. 连接服务器 ```c struct sockaddr_in server_address; memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_port = htons(port); InetPton(AF_INET, server_ip, &server_address.sin_addr); result = connect(sock, (struct sockaddr*)&server_address, sizeof(server_address)); if (result == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) { printf("Error connecting to server: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } ``` 4. 使用select函数等待连接完成 ```c fd_set write_fds; FD_ZERO(&write_fds); FD_SET(sock, &write_fds); struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; result = select(0, NULL, &write_fds, NULL, &timeout); if (result == 0) { printf("Connection timed out.\n"); closesocket(sock); WSACleanup(); return 1; } else if (result == SOCKET_ERROR) { printf("Error waiting for connection: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } ``` 5. 发送数据 ```c const char* message = "Hello, server!"; result = send(sock, message, strlen(message), 0); if (result == SOCKET_ERROR) { printf("Error sending data: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } ``` 6. 接收数据 ```c char buffer[1024]; result = recv(sock, buffer, sizeof(buffer), 0); if (result == SOCKET_ERROR) { printf("Error receiving data: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } else { buffer[result] = '\0'; printf("Received data: %s\n", buffer); } ``` 7. 关闭socket ```c closesocket(sock); WSACleanup(); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值