用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

c-windows_socket-server

2014-04-27 作者: 我的程序员之路举报

[c]代码库

/******************************************************************************
* 程序: winsock_server.c
* 目的: 创建流式套接字,等待客户端连接并向客户端发送数据
* 作者: 周 晨
* 学号: 2011210154
*****************************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include <Windows.h>
 
/* 导入win32函数库 */
#pragma comment(lib, "WS2_32.lib")
 
/* winsock初始化成功标志 */
#define WSA_STARTUP_SUCCESS  0
/* 请求队列长度 */
#define REQUEST_QUEUE_LENGTH 10
 
/* 获取系统当前的日期和时间 */
void GetSystemCurrentTime()
{
    SYSTEMTIME sys;
    GetLocalTime(&sys);
    printf("%4d-%02d-%02d %02d:%02d:%02d - ",
        sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond);
}
 
int main()
{
    /* 接收函数调用返回的状态码 */
    int state_code = 0;
    /* 服务器端口号 */
    int server_port = 5199;
    /* 声明一个用于监听的Socket连接 */
    SOCKET listener_socket;
    /* 声明一个客户端连接成功的Socket */
    SOCKET client_socket;
    /* 声明客户端的网络地址结构 */
    SOCKADDR_IN client_address;
    /* 声明服务器端的网络地址结构 */
    SOCKADDR_IN server_address;
    /* 清空服务器端的网络地址结构 */
    memset(&server_address, 0, sizeof(server_address));
    /* 设置为Internet协议簇 */
    server_address.sin_family = AF_INET;
    /* 设置服务器本地IP地址 */
    server_address.sin_addr.S_un.S_addr = INADDR_ANY;
    /* 转化服务器端口号 */
    server_address.sin_port = htons(server_port);
    /* 网络地址结构所占字节大小 */
    int server_address_size = (int)sizeof(SOCKADDR_IN);
    int client_address_size = (int)sizeof(SOCKADDR_IN);
    /* 当前已连接的客户端数目 */
    int visitors = 0;
    /* 接受服务器数据的缓冲区 */
    char buffer[] = "Client,你好,欢迎你的连接,我是Server...";
 
    GetSystemCurrentTime();
    printf("Server:服务器已启动!\n");
 
    /* 初始化 WinSock 连接 */
    WSADATA wsadata;
    state_code = WSAStartup(MAKEWORD(2, 2), &wsadata);
    if (WSA_STARTUP_SUCCESS != state_code)
    {
        GetSystemCurrentTime();
        printf("发生错误:初始化WinSock连接失败!错误码:%d\n", WSAGetLastError());
        exit(EXIT_FAILURE);
    }
 
    /* 创建监听器的 Socket 连接 */
    listener_socket = socket(AF_INET, SOCK_STREAM, 0);
    GetSystemCurrentTime();
    if (INVALID_SOCKET == listener_socket)
    {
        printf("发生错误:服务器监听套接字创建失败!错误码:%d\n", WSAGetLastError());
        closesocket(listener_socket);
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    printf("Server:服务器监听套接字已成功创建!\n");
 
    /* 将本地地址绑定到监听套接字 */
    state_code = bind(listener_socket, (SOCKADDR*)&server_address, server_address_size);
    GetSystemCurrentTime();
    if (SOCKET_ERROR == state_code)
    {
        printf("发生错误:服务器本地地址绑定到监听套接字失败!错误码:%d\n", WSAGetLastError());
        closesocket(listener_socket);
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    printf("Server:服务器本地地址已成功绑定到监听套接字!\n");
 
    /* 开始监听,并指定监听套接字请求队列长度 */
    state_code = listen(listener_socket, REQUEST_QUEUE_LENGTH);
    GetSystemCurrentTime();
    if (SOCKET_ERROR == state_code)
    {
        printf("发生错误:服务器监听套接字失败!错误码:%d\n", WSAGetLastError());
        closesocket(listener_socket);
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    printf("Server:服务器已成功启动套接字监听!\n");
    GetSystemCurrentTime();
    printf("Server:开始监听...\n");
 
    /* 服务器主循环 - 接受和处理来自客户端的连接请求 */
    while (1)
    {
        client_socket = accept(listener_socket, (SOCKADDR*)&client_address, &client_address_size);
        GetSystemCurrentTime();
        if (INVALID_SOCKET == client_socket)
        {
            printf("发生错误:当前客户端连接失败!错误码:%d\n", WSAGetLastError());
            closesocket(client_socket);
            WSACleanup();
            exit(EXIT_FAILURE);
        }
        visitors++; // 访问量+1
        /* 向客户端发送消息 */
        send(client_socket, buffer, strlen(buffer), 0);
        printf("Server:发现新的连接用户,已发送问候消息!\n");
        GetSystemCurrentTime();
        printf("Server:当前累计在线 %d 位用户!\n", visitors);
        closesocket(client_socket);
    }
 
    return EXIT_SUCCESS;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...