win下 socket基础实现(C++) 01

来源:互联网 发布:糊网络用语什么意思 编辑:程序博客网 时间:2024/06/05 10:33

本代码实现功能:

写一个socket 通讯的服务端和接收端,发送”Hi, I’m XM”,收到”I heard”,要求服务端和接收端都有显示信息


只提供完整代码,关于函数具体用法和作用还请移步其它博客,有很多。


服务端代码:

#include <iostream>
#include <winsock2.h>


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


using namespace std;


int main()
{
    //初始化WinSock服务
    WSADATA WsaDat;
    if (WSAStartup(MAKEWORD(2,2), &WsaDat) != 0)
    {
        cout << "WinSock服务初始化失败!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
    //创建套接字
    SOCKET Socket = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
    if (Socket == INVALID_SOCKET)
    {


        cout << "创建套接字错误!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
    //主机名解析, 服务器不需要主动连接客户机
    /*struct hostent *host;
    if ((host = gethostbyname("localhost")) == NULL)
    {
        cout << "主机名解析失败!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }*/
    //配置服务器地址结构信息
    SOCKADDR_IN serverInf;
    serverInf.sin_port = htons(8888);
    serverInf.sin_family = AF_INET;
    serverInf.sin_addr.s_addr = INADDR_ANY;
    //连接服务器, 这就是服务器啊
    /*if (connect(Socket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) != 0)
    {
        cout << "连接服务器失败!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
    //接受信息并显示
    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));
    int inDataLength = recv(Socket, buffer, 1024, 0);
    cout << buffer;*/
if (bind(Socket, (SOCKADDR*)(&serverInf), sizeof(serverInf)) == SOCKET_ERROR)
    {
        cout << "不能绑定地址信息到套接字\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
listen(Socket, 1);
SOCKET TempSock = SOCKET_ERROR;
while (TempSock == SOCKET_ERROR)
    {
        cout << "服务器正在等待客户机连接...\n";
        TempSock = accept(Socket, NULL, NULL);
    }
Socket = TempSock;
cout << "有客户机已连接!\n";
char buffer_r[1024];
    memset(buffer_r, 0, sizeof(buffer_r));
    int inDataLength = recv(Socket, buffer_r, 1024, 0);
    cout << "已接收:" << buffer_r << endl;
char *szMessage = "I heard!\n";
send(Socket, szMessage, strlen(szMessage),0);
cout << "已发送:I heard!" << endl;
    //断开套接字连接, 不许发送但允许接收
    shutdown(Socket, SD_SEND);
    //关闭套接字, 释放资源
    closesocket(Socket);
    //guanbiWinSock服务, 清理
    WSACleanup();
    system("PAUSE");
    return 0;
}


客户端代码:


#include <iostream>
#include <winsock2.h>
#include <string>


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


using namespace std;


int main()
{
    //初始化WinSock服务
    WSADATA WsaDat;
    if (WSAStartup(MAKEWORD(2,2), &WsaDat) != 0)
    {
        cout << "WinSock服务初始化失败!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
    //创建套接字
    SOCKET Socket = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
    if (Socket == INVALID_SOCKET)
    {


        cout << "创建套接字错误!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
    //主机名解析
    struct hostent *host;
    if ((host = gethostbyname("localhost")) == NULL)
    {
        cout << "主机名解析失败!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
    //配置服务器地址结构信息
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port = htons(8888);
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long *)host -> h_addr);
    //连接服务器
    if (connect(Socket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) != 0)
    {
        cout << "连接服务器失败!\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }
//发送消息
char *s = "Hi, I'm XM!";
send(Socket, s, strlen(s), 0);
cout << "已发送:Hi, I'm XM!" << endl;
//接受信息并显示
char buffer_r[1024];
    memset(buffer_r, 0, sizeof(buffer_r));
    int inDataLength = recv(Socket, buffer_r, 1024, 0);
    cout << "已接收:" << buffer_r;
//断开套接字连接, 不许发送但允许接收
shutdown(Socket, SD_SEND);
//关闭套接字, 释放资源
closesocket(Socket);
    //关闭WinSock服务, 清理
    WSACleanup();
    system("PAUSE");
    return 0;
}

0 0
原创粉丝点击