免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1374 | 回复: 0
打印 上一主题 下一主题

用线程扫描端口,加与不加WaitForMultipleObjects()有很大区别,不知原因 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-18 11:34 |只看该作者 |倒序浏览
#include <winsock2.h>
#include <stdio.h>
//#include <time.h>
#pragma comment(lib, "ws2_32.lib")

PHOSTENT hostinfo;
SOCKET sock_id;
SOCKADDR_IN my_addr;
CRITICAL_SECTION gcs; //临界区

void Interface();
int StartSock();
int CreateSocket();
DWORD WINAPI threadA(void);
int i = 0;

int main(int argc, char **argv)
{
    Interface();

    if (-1 == StartSock())
        return -1;

    if (-1 == CreateSocket())
        return -1;

    WSACleanup();
    return 0;
}

void Interface()
{
   
}

int StartSock()
{
    WSADATA  wsaData;
    char     name[60];

    //初始化套接字
    if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
    {
        printf("WSAStartup error!\n");
        return -1;
    }
    if (0 != gethostname(name, sizeof(name)))
    {
        printf("gethostname error!\n");
        return -1;
    }
    hostinfo = gethostbyname(name);
    if (NULL == hostinfo)
    {
        printf("gethostbyname error!\n");
        return -1;
    }
   
    return 0;
}

int CreateSocket()
{
    HANDLE   hFind[10];
    //建立流套接字句柄
    sock_id = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

    if (INVALID_SOCKET == sock_id)
    {
        printf("socket error!\n");
        WSACleanup();
        return -1;
    }
    InitializeCriticalSection(&gcs);    //初始化临界区
    for (int i = 0; i < 10; ++i)
    {
        hFind = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadA, 0, 0, NULL);
        Sleep(500);
    }
    WaitForMultipleObjects(10,hFind,TRUE,100000);  //等待所有的线程完成  等待函数
    DeleteCriticalSection(&gcs);        //删除临界区
   
    return 0;
}

DWORD WINAPI threadA(void)
{
    while(i < 60000)
    {
        my_addr.sin_family        = AF_INET;
        my_addr.sin_port        = htons(i);
        my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

        if (SOCKET_ERROR == connect(sock_id, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)))
        {
            printf("Port  %d  -close\n", i);
        }
        else
        {
            printf("Port  %d  -open\n", i);
        }
        //EnterCriticalSection(&gcs);      //进入临界区
        ++i;
        //LeaveCriticalSection(&gcs);     //离开临界区

    }
    closesocket(sock_id);
    return 0;
}
在没加WaitForMultipleObjects()前,输出是有重复的,输出也就20几行,当加了WaitForMultipleObjects()后,输出全部端口,也无重复,不知道这是为什么?
还有Sleep()、临界区,它们的作用是什么,在这里有没有用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP