Socket 连接简易编程

来源:互联网 发布:单片机开发和java 编辑:程序博客网 时间:2024/04/28 14:23

客户端:

#include <iostream>#include <winsock2.h>using namespace std;#pragma  comment (lib, "ws2_32.lib")#define PORT 4000#define IP_ADDRESS "127.0.0.1"int main(int agrc, char * agrv[]){    WSADATA ws;    SOCKET ClientSocket;    struct sockaddr_in ServerAddr;    int Ret = 0;    int AddrLen = 0;    HANDLE hTread = NULL;    char SendBuffer[MAX_PATH];    int errorcode = 0;    //Init Window Socket    if ((errorcode = WSAStartup(MAKEWORD(2, 2), &ws)) != 0)    {        cout << "Init Windows Socket Failed::" << errorcode << endl;        return -1;    }    // Create Socket     ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (ClientSocket == INVALID_SOCKET)    {        cout << "Create Socket Failed::" << WSAGetLastError() << endl;        return -1;    }    ServerAddr.sin_family = AF_INET;    ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);    ServerAddr.sin_port = htons(PORT);    memset(ServerAddr.sin_zero, 0x00, 8);    // connect    Ret = connect(ClientSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr));    if (Ret == SOCKET_ERROR)    {        cout << "Connect Error::" << WSAGetLastError() << endl;        return -1;    }else{        cout << "连接成功!!" << endl;    }    while (true)    {        cin.getline(SendBuffer, sizeof(SendBuffer));        Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);        if (Ret == SOCKET_ERROR)        {            cout << "Sentd Info Error::" << GetLastError() << endl;            break;        }    }    closesocket(ClientSocket);    WSACleanup();    return 0;}

服务端:

#include <iostream>#include <WinSock2.h>using namespace std;#pragma comment (lib, "ws2_32.lib")#define PORT 4000#define IP_ADDREESS "127.0.0.1"int main(int agrc, char* argc[]){    WSADATA ws;  // 之后储存WSAStartUP返回 的数据, 全称:Windows Socker API Data    SOCKET ServerSocket = 0, ClientSocket = 0;    struct sockaddr_in LocalAddr, ClientAddr;    int errorcode;    int Ret = 0;    int AddrLen = 0;    HANDLE hThread = NULL;    //Init Windwos Socket    if ((errorcode = WSAStartup(MAKEWORD(2, 2), &ws)) != 0)    {        cout << "Create Socket Failed:" << errorcode << endl;        return -1;    }    // CreateSocket     ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (ServerSocket == INVALID_SOCKET)    {        cout << "Create Socket Failed::" << WSAGetLastError() << endl;        return -1;    }    LocalAddr.sin_family = AF_INET;    LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDREESS);  //将ip 127.0.0.1 转换成网络字节序     LocalAddr.sin_port = htons(PORT);       // 转换为网络字节序    memset(LocalAddr.sin_zero, 0x00, 8);    //Bind Socket    Ret = bind(ServerSocket,(struct sockaddr*)&LocalAddr, sizeof(LocalAddr));    if (Ret != 0)    {        cout << "Bind Socket Failded::" << WSAGetLastError() << endl;        return -1;    }    // listen    Ret = listen(ServerSocket, 10);    if(Ret != 0)    {        cout << "Listen Socket Failed::" << WSAGetLastError() << endl;        return -1;    }    cout << " 服务端已经启动!" << endl;    while (true)    {        AddrLen = sizeof(ClientAddr);        ClientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);        if (ClientSocket == INVALID_SOCKET)        {            cout << "Accept Failed::" << WSAGetLastError() << endl;            break;        }        char RecvBuffer[MAX_PATH];        while (true)        {            memset(RecvBuffer, 0x00, sizeof(RecvBuffer));            // 接收数据            // recv函数返回实际copy的字节数;            //  copy时出错,返回SOCKET_ERROR;等待协议接收数据时网络中断,返回0。            Ret = recv(ClientSocket, RecvBuffer, MAX_PATH, 0);            if (Ret == 0 || Ret == SOCKET_ERROR)            {                cout << "Recv Failed::" << WSAGetLastError() << endl;                break;            }            cout << "接收到的客户信息为:" << RecvBuffer << endl;        }    }    closesocket(ServerSocket);    closesocket(ClientSocket);    WSACleanup();    return 0;}



AF_INET 与 AF_INET6
AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的;而 AF_UNIX 则是 Unix 系统本地通信。

选择 AF_INET 的目的就是使用 IPv4 进行通信。因为 IPv4 使用 32 位地址,相比 IPv6 的 128 位来说,计算更快,便于用于局域网通信。

而且 AF_INET 相比 AF_UNIX 更具通用性,因为 Windows 上有 AF_INET 而没有 AF_UN

0 0
原创粉丝点击