基于windows的简单服务器端和客户端

服务器端套接字创建步骤:
1.调用socket函数创建套接字。
2.调用bind函数分配IP地址和端口号。
3.调用listen函数转为可接收请求状态。
4.调用该accept函数受理连接请求。

客户端套接字创建步骤:
1.调用socket函数创建套接字。
2.调用connect函数向服务器端发送连接请求。

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

void ErrorHandling(char* message);

int main()
{
    WSADATA wsaData;
    SOCKET hServerSock, hClientSock;
    SOCKADDR_IN serverAddr, clientAddr;
    int szClientAddr;
    char message[] = "hello world!";
    int listenPort = 8000;

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        ErrorHandling("WSAStartup() error.");

    hServerSock = socket(PF_INET, SOCK_STREAM, 0);
    if (hServerSock == INVALID_SOCKET)
        ErrorHandling("socket() error.");

    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(listenPort);

    if (bind(hServerSock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
        ErrorHandling("bind() error.");
    if (listen(hServerSock, 5) == SOCKET_ERROR)
        ErrorHandling("listen() error.");

    szClientAddr = sizeof(clientAddr);
    hClientSock = accept(hServerSock, (SOCKADDR*)&clientAddr, &szClientAddr);
    if (hClientSock == INVALID_SOCKET)
        ErrorHandling("accept() error.");

    send(hClientSock, message, sizeof(message), 0);
    closesocket(hClientSock);
    closesocket(hServerSock);
    WSACleanup();
    return 0;
}

void ErrorHandling(char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

void ErrorHandling(char* message);

int main()
{
    WSADATA wsaData;
    SOCKET hSocket;
    SOCKADDR_IN serverAddr;

    char message[30];
    int strLen;

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        ErrorHandling("WSAStartup() error.");

    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if (hSocket == INVALID_SOCKET)
        ErrorHandling("socket() error.");

    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serverAddr.sin_port = htons(8000);

    if (connect(hSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
        ErrorHandling("connect() error.");

    strLen = recv(hSocket, message, sizeof(message) - 1, 0);
    if (strLen == -1)
        ErrorHandling("read() error.");
    printf("Message recv: %s\n", message);

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

void ErrorHandling(char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

猜你喜欢

转载自www.cnblogs.com/ACGame/p/9880338.html