Win32 socket简单实例

来源:互联网 发布:php的面向对象 编辑:程序博客网 时间:2024/05/21 21:40
服务器端:
 

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

#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <process.h>

#define _LINK_PORT_ 8088
#define _BUFFER_LENGTH_ 512
#define _DEFAULT_PORT_ "12345"

//接受客户端消息的线程函数

unsigned __stdcall ThreadRecv(LPVOID param)
{
    SOCKET ListenSocket = (SOCKET)param;

    SOCKET sockClient = INVALID_SOCKET;
    printf("start accept...\n");
    sockClient = accept(ListenSocket, NULL, NULL);
    printf("end accept...\n");
    if(INVALID_SOCKET == sockClient)
    {
        printf("accept failed:%d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    char recvBuf[_BUFFER_LENGTH_] = {0};
    int nRecv = 0;
    while( SOCKET_ERROR != nRecv)
    {
        nRecv = recv(sockClient, recvBuf, _BUFFER_LENGTH_, 0);
        printf("ClinetSocket=%d, received count=%d\n", sockClient, nRecv);
        if(SOCKET_ERROR == nRecv)
        {
            //标记当前线程为有信号

            _endthreadex(0);
            printf("recv failed! current thread's state is signaled! error=%d, clientsocket=%d", WSAGetLastError(), sockClient);
        }
    }

    //关闭Socket

    printf("ClientSocket=%d, thread closing...\n", sockClient);
    shutdown(sockClient, SD_BOTH);
    closesocket( sockClient );
    return 0;
}

int main()
{
    struct addrinfo *result = NULL,
        *ptr = NULL,
        hints;
    int iResult;

    //Initialize winsocket

    WSADATA wsaData;
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_IP;
    hints.ai_flags = AI_PASSIVE;

    //Resolve the local address and port to be used by the server;

    iResult = getaddrinfo(NULL, _DEFAULT_PORT_, &hints, &result);
    if(iResult != 0)
    {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }

    //Create a SOCKET for the server to listen for client connections

    SOCKET ListenSocket = INVALID_SOCKET;
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if(INVALID_SOCKET == ListenSocket)
    {
        printf("Error at socket(): %d\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }

    //Setup the TCP listening socket

    iResult = bind(ListenSocket, result->ai_addr, result->ai_addrlen);
    if(iResult == SOCKET_ERROR)
    {
        printf("bind failed: %d\n", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    //Listen connection

    if(listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
    {
        printf("Error at bind():%d \n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    while(true)
    {
        SOCKET sockClient = INVALID_SOCKET;

        unsigned threadId;
        HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &ThreadRecv,(void*)ListenSocket, 0, &threadId);

        printf("waitting for ClinetSocket to finish...\n");
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
    }
    WSACleanup();

    return 0;
}

客户端:

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

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

#define _BUFFER_LENGTH_ 512
#define _DEFAULT_PORT_ 12345

void main(int argc, char* argv[])
{
    //Initialize Winsocket

    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if( NO_ERROR != iResult)
        printf("Error at WSAStartup()\n");
    
    //Create a SOCKET for connecting to server;

    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(ConnectSocket == INVALID_SOCKET)
    {
        printf("Error at socket():%ld\n", WSAGetLastError());
        WSACleanup();
        return;
    }

    //-----------------

    //the sockaddr_in structure specifies the address family,

    //IP address, and port of the server to be connected to.

    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(_DEFAULT_PORT_);

    //Connect to server

    int connRS = connect(ConnectSocket, (SOCKADDR*)&clientService, sizeof(clientService));
    if( SOCKET_ERROR == connRS )
    {
        printf("Failed to connect.\n");
        WSACleanup();
        return;
    }
    
    printf("Connected to server.\n");

    
    char* sendBuf = "this's a test";
    char recvBuf[_BUFFER_LENGTH_] = {0};
    //Send an initial buffer

    iResult = send(ConnectSocket, sendBuf, strlen(sendBuf), 0);
    if(iResult == SOCKET_ERROR)
    {
        printf("send failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return;
    }

    printf("Bytes send:%d\n", iResult);

    //receive data

    do{
        iResult = recv(ConnectSocket, recvBuf, _BUFFER_LENGTH_, 0);
        if(iResult > 0)
            printf("Bytes received: %d\n", iResult);
        else if(iResult == 0)
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    }while(iResult > 0);

    //shutdown the connection for sending since no more data will be sent;

    iResult = shutdown(ConnectSocket, SD_SEND);
    if(iResult == SOCKET_ERROR)
    {
        printf("shutdown failed:%d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return;
    }

    WSACleanup();
    return;
}

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(1607) | 评论(0) | 转发(0) |
0

上一篇:Firefox在线收藏插件及快车插件

下一篇:DirectX笔记

相关热门文章
  • 浅析MySQL数据库OLTP基准测试...
  • MySQL执行计划分析工具EXPLAIN...
  • 主流MySQL集群实现架构优劣势...
  • DB210.5.5存在Bug打补丁到10.5...
  • softRoCE/RDMA 安装与测试...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
原创粉丝点击