首页/杀毒教程/内容

网络与黑客编程基本知识

杀毒教程2023-12-29 阅读()
[摘要]bytesRecv == WSAECONNRESET ) { printf( "Connection Closed.\n"); ...
bytesRecv == WSAECONNRESET ) {

            printf( "Connection Closed.\n");

            break;

        }

        if (bytesRecv < 0)

            return;

        printf( "Bytes Recv: %ld\n", bytesRecv );

    }

    return;

}

下面是服务器端代码:

#include <stdio.h>

#include <winsock2.h>

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

void main() {

                                                                              // 初始化

    WSADATA wsaData;

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

    if ( iResult != NO_ERROR )

        printf("Error at WSAStartup()\n");

                                                                                // 建立socket

    SOCKET server;

    server = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( server == INVALID_SOCKET ) {

        printf( "Error at socket(): %ld\n", WSAGetLastError() );

        WSACleanup();

        return;

    }

                                                                                         // 绑定socket

    sockaddr_in service;

    service.sin_family = AF_INET;

    service.sin_addr.s_addr = inet_addr( "127.0.0.1" );

    service.sin_port = htons( 27015 );

    if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {

        printf( "bind() failed.\n" );

        closesocket(server);

        return;

    }

    

                                                                              // 监听 socket

    if ( listen( server, 1 ) == SOCKET_ERROR )

        printf( "Error listening on socket.\n");

                                                                                // 接受连接

    SOCKET AcceptSocket;

    printf( "Waiting for a client to connect...\n" );

    while (1) {

        AcceptSocket = SOCKET_ERROR;

        while ( AcceptSocket == SOCKET_ERROR ) {

            AcceptSocket = accept( server, NULL, NULL );

        }

        printf( "Client Connected.\n");

        server = AcceptSocket;

        break;

    }

    

                                                                                     // 发送接受数据

    int bytesSent;

    int bytesRecv = SOCKET_ERROR;

    char sendbuf[32] = "Server: Sending Data.";

    char recvbuf[32] = "";

    

    bytesRecv = recv( server, recvbuf, 32, 0 );

    printf( "Bytes Recv: %ld\n", bytesRecv );

    

    bytesSent = send( server, sendbuf, strlen(sendbuf), 0 );

    printf( "Bytes Sent: %ld\n", bytesSent );

    return;

}

本程序仅仅描述了同步的情况!

   第五节 多线程编程介绍

    对于多线程的基本概念,我不在赘述,是个只要学习过一门编程语言就应该多进程和线程有个基本的了解.这里重点介绍一下如何实现多线程.

通常一个程序的主线程有操作系统创建,如果想让其创建额外的线程,可以调用CreateThread()函数来完成.函数原形如下:

HANDLE CreateThread()

{

        LPSECURITY_ATTRIBUTES LPThreadAttributes,  //指向SECURITY_ATTRIBUTES的指针

        SIZE_T dwStackSize,                        //表示线程为自己所用堆栈分配的地址空间的大小 系统缺省值为0

        LPTHREAD_START-TOUTINE lpStartAddress,     //表示新线程开始执行时代码所在函数的地址 即线程函数名

        LPVOID lpParameter,                        //是传入线程函数的参数

        DWORD dwCreationFlags,                     //指定控制线程创建的附加标志 取0线程立即执行 取CREATE_SUSPENDED线程挂起

        LPDWORD lpThreadld                         //是个DWORD类型的地址,返回赋给该新线程的ID

}

线程函数lpParameter必须有以下原形:

DWORD WINAPI XXXThreadFun(LPVOID lpParameter)

{

        return(0);

}

________________________________________________________________________________________

下面我们来创建一个线程:

#include <windows.h>

#include <stdio.h>

DWORD WINAPI ThreadFunc( LPVOID lpParam )                         //线程函数, 跟普通的函数没什么两样

{

    printf( "Parameter = %d.", *(DWORD*)lpParam );

return 0;

}

VOID main( VOID )

{

    DWORD dwThreadId, dwThrdParam = 1;

    HANDLE hThread;

hThread = CreateThread( NULL,0,ThreadFunc,&dwThrdParam, 0,&dwThreadId);

      if (hThread == NULL)

   {

      printf( "CreateThread failed (%d)\n", GetLastError() );

   }

   else

   {

      _getch();

      CloseHandle( hThread );

   }

}

关于线程同步的问题,这里就不再讲解,请大家自己查阅资料,不查阅以后可能会有困难啊.培养一下各位的自己动手能力.





第1页  第2页  第3页 

……

相关阅读