// MySocket.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#pragma comment(lib, "ws2_32.lib")
//Socket Select模型简单示例
SOCKET sClient;
DWORD WINAPI WorkerThread(LPVOID lpParameter);
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
INT nResult;
DWORD dwThreadId;
//1.初始化Socket
nResult = WSAStartup(MAKEWORD( 2, 2 ), &wsaData);
if (NO_ERROR != nResult)
{
OutputDebugString(_T("/n WSAStartup()执行错误."));
return false;
}
//2.监听套接字
SOCKET Listen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//3.填充地址家族
struct sockaddr_in ServerAddress, client;
ServerAddress.sin_family = AF_INET;
ServerAddress.sin_addr.s_addr = INADDR_ANY;
ServerAddress.sin_port = htons(10000);
//4.端口绑定
bind(Listen, (struct sockaddr *)&ServerAddress, sizeof(SOCKADDR_IN));
//5.监听端口
listen(Listen, 5);
CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId);
//6.接收连接
int iaddrSize = sizeof(SOCKADDR_IN);
timeval tv;
fd_set fdread;
while (TRUE)
{//select模型步骤
//1.初始化fd_set
FD_ZERO(&fdread);
//2.将套接字句柄分配给fd_set,放入集合
FD_SET(Listen, &fdread);
tv.tv_sec = 2;//这里我们打算让select等待两秒后返回,避免被锁死,也避免马上返回
tv.tv_usec = 0;
//3.调用select函数
int ret = select(0, &fdread, NULL, NULL, &tv);
//4.根据select返回值检查fd_set集合
if (ret > 0)
{
//5.属于集合处理
if (FD_ISSET(Listen, &fdread))
{
std::cout<<_T("接收到一个事件!");
}
}
//
if (FD_ISSET(Listen, &fdread))
{
sClient = accept(Listen, (struct sockaddr *)&client, &iaddrSize);
//break;
}
}
}
DWORD WINAPI WorkerThread(LPVOID lpParam)
{
while(TRUE)
{
char buffer[128];
ZeroMemory(buffer, 128);
//这里同样可以用select,用法和上面一样
recv(sClient,buffer,128,0);
std::cout<<buffer<<endl;
}
return 0;
}
1120

被折叠的 条评论
为什么被折叠?



