winsock select 학습 코드 (2)
6698 단어 select
서버는 클라이언트가 보낸 문자열만 받아들여 표시합니다
클라이언트는 전송 수를 조절할 수 있지만 64를 초과할 수 없습니다
// SelectServer.cpp : 。
//
#include "stdafx.h"
#include <winsock2.h>
#include <conio.h>
#pragma comment(lib,"ws2_32")
#define SOCKET_MAXCNT 64
#define THREAD_NUM 2
#define CONNECT_PORT 8773
#define CONNECT_ADDR "127.0.0.1"
#define DATA_BUF_SZIE 8192
typedef struct _SOCKET_INFORMATION {
CHAR Buffer[DATA_BUF_SZIE];
WSABUF DataBuf;
SOCKET Socket;
OVERLAPPED Overlapped;
} SOCKET_INFORMATION, * LPSOCKET_INFORMATION;
DWORD totalSockets = 0;
LPSOCKET_INFORMATION SocketArray[FD_SETSIZE];
BOOL CreateSocketInformation(SOCKET s)
{
LPSOCKET_INFORMATION SI;
printf("Accepted socket number %d
", s);
if ((SI = (LPSOCKET_INFORMATION) GlobalAlloc(GPTR,
sizeof(SOCKET_INFORMATION))) == NULL)
{
printf("GlobalAlloc() failed with error %d
", GetLastError());
return FALSE;
}
// Prepare SocketInfo structure for use.
SI->Socket = s;
SocketArray[totalSockets] = SI;
totalSockets++;
return(TRUE);
}
void FreeSocketInformation(DWORD Index)
{
LPSOCKET_INFORMATION SI = SocketArray[Index];
DWORD i;
closesocket(SI->Socket);
printf("Closing socket number %d
", SI->Socket);
GlobalFree(SI);
// Squash the socket array
for (i = Index; i < totalSockets; i++)
{
SocketArray[i] = SocketArray[i + 1];
}
totalSockets--;
}
int _tmain(int argc, _TCHAR* argv[])
{
WSAData wsaData;
SOCKADDR_IN InternetAddr = {0};
FD_SET ReadSet;
DWORD i = 0;
DWORD total = 0;
DWORD Flags;
DWORD RecvBytes = 0;
SOCKET listenSock = INVALID_SOCKET;
SOCKET acceptSock = INVALID_SOCKET;
if( WSAStartup(MAKEWORD(2,2),&wsaData) != 0 )
{
printf("WSAStartup error,exit
");
goto SOCKET_CLEAN;
}
listenSock = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,
WSA_FLAG_OVERLAPPED);
if(listenSock == INVALID_SOCKET)
{
printf("WSASocket error
");
goto SOCKET_CLEAN;
}
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InternetAddr.sin_port = htons(CONNECT_PORT);
if (bind(listenSock, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr))
== SOCKET_ERROR)
{
printf("bind() failed with error %d
", WSAGetLastError());
goto SOCKET_CLEAN;
}
if (listen(listenSock, 5))
{
printf("listen() failed with error %d
", WSAGetLastError());
goto SOCKET_CLEAN;
}
// Change the socket mode on the listening socket from blocking to
// non-block so the application will not block waiting for requests.
ULONG NonBlock = 1;
if (ioctlsocket(listenSock, FIONBIO, &NonBlock) == SOCKET_ERROR)
{
printf("ioctlsocket() failed with error %d
", WSAGetLastError());
goto SOCKET_CLEAN;
}
while(1)
{
FD_ZERO(&ReadSet);
FD_SET(listenSock, &ReadSet);
for (i = 0; i < totalSockets; i++)
{
FD_SET(SocketArray[i]->Socket, &ReadSet);
}
total = select(0,&ReadSet,NULL,NULL,NULL);
if(total == SOCKET_ERROR)
{
printf("select() failed with error %d
", WSAGetLastError());
goto SOCKET_CLEAN;
}
if(FD_ISSET(listenSock,&ReadSet))
{
total--;
acceptSock = accept(listenSock,NULL,NULL);
if(acceptSock == INVALID_SOCKET)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
printf("accept() failed with error %d
", WSAGetLastError());
goto SOCKET_CLEAN;
}
}else
{
NonBlock = 1;
int ret = ioctlsocket(acceptSock,FIONBIO, &NonBlock);
if(ret == SOCKET_ERROR)
{
printf("ioctlsocket() failed with error %d
", WSAGetLastError());
goto SOCKET_CLEAN;
}
if (CreateSocketInformation(acceptSock) == FALSE)
goto SOCKET_CLEAN;
}
}
for (i = 0; total > 0 && i < totalSockets; i++)
{
LPSOCKET_INFORMATION SocketInfo = SocketArray[i];
SocketInfo->DataBuf.buf = SocketInfo->Buffer;
SocketInfo->DataBuf.len = DATA_BUF_SZIE;
if(FD_ISSET(SocketInfo->Socket,&ReadSet))
{
total--;
Flags = 0;
ZeroMemory(SocketInfo->Buffer,DATA_BUF_SZIE);
if (WSARecv(SocketInfo->Socket, &(SocketInfo->DataBuf), 1, &RecvBytes,
&Flags, NULL, NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
printf("WSARecv() failed with error %d
", WSAGetLastError());
FreeSocketInformation(i);
}
continue;
}else
{
printf(SocketInfo->Buffer);
if(RecvBytes == 0)
{
FreeSocketInformation(i);
continue;
}
}
}
}
}
SOCKET_CLEAN:
if(listenSock != INVALID_SOCKET)
{
closesocket(listenSock);
listenSock = INVALID_SOCKET;
}
if(acceptSock != INVALID_SOCKET)
{
closesocket(acceptSock);
acceptSock = INVALID_SOCKET;
}
WSACleanup();
return 0;
}
// CommonClient.cpp : 。
//
#include "stdafx.h"
#include <winsock2.h>
#include <conio.h>
#pragma comment(lib,"ws2_32")
#define SOCKET_MAXCNT 64
#define THREAD_NUM 22
#define CONNECT_PORT 8773
#define CONNECT_ADDR "127.0.0.1"
DWORD WINAPI SocketFunc(LPVOID pM)
{
char buf[512] = {0};
SOCKET sock;
int result;
struct sockaddr_in cli_addr;
int num = *(int*)pM;
sock = socket(AF_INET,SOCK_STREAM,0);
cli_addr.sin_family = AF_INET;
cli_addr.sin_port = htons(CONNECT_PORT);
cli_addr.sin_addr.s_addr = inet_addr(CONNECT_ADDR);
result = connect(sock,(struct sockaddr*)&cli_addr,sizeof(cli_addr));
if(result == SOCKET_ERROR)
{
printf("%d thread: connect error
",num);
exit(1);
}
while(1)
{
sprintf(buf,"%d thread: %s",num,"hello world!
");
printf(buf);
result = send(sock,buf,100,0);
if(result == SOCKET_ERROR)
{
printf("%d error
",num);
return 0;
}
Sleep(3000);
}
exit(1);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int num[SOCKET_MAXCNT] = {0};
WSADATA wsa_data;
WSAStartup(WINSOCK_VERSION,&wsa_data);
//
for(int i = 0 ;i < SOCKET_MAXCNT;i++)
{
num[i] = i;
}
for(int i = 0; i < THREAD_NUM;i++)
{
HANDLE hThread = CreateThread(NULL,0,SocketFunc,&num[i],0,NULL);
if(hThread != NULL)
{
CloseHandle(hThread);
}
}
while(1)
{
Sleep(100000);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
🕗[프로그래머스] 입양 시각 구하기(2)문제 설명 ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.