[상단] Socket 에뮬레이션 클라이언트 및 서버
:
#include <stdio.h>
#include <WinSock2.h>
#include <process.h>
#pragma comment(lib, "ws2_32.lib")
HANDLE g_hEvent = NULL;
CRITICAL_SECTION g_crs;
void myPrintf(const char* psz1, ...)
{
::EnterCriticalSection(&g_crs);
va_list arg;
va_start(arg, psz1);
vprintf(psz1, arg);
va_end(arg);
::LeaveCriticalSection(&g_crs);
}
unsigned __stdcall ClientProc(void* parm)
{
WSADATA wsData;
SOCKET skClient;
SOCKADDR_IN addrServ;
char msg[1024]={0};
fd_set rFSet;
int iRet = WSAStartup(MAKEWORD(2, 2), &wsData);
if (iRet != 0)
{
myPrintf(">>> client WSAStartup fail
");
return 1;
}
skClient = socket(AF_INET, SOCK_STREAM, 0);
myPrintf(">>> client socket %d
", skClient);
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(6000);
addrServ.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
WaitForSingleObject(g_hEvent, INFINITE);
iRet = connect(skClient, (sockaddr*)&addrServ, sizeof(SOCKADDR_IN));
if (iRet != 0)
{
myPrintf(">>> client connect fail
");
goto end;
}
while (true)
{
::EnterCriticalSection(&g_crs);
printf(">>> client please input send msg: ");
scanf("%s", msg);
::LeaveCriticalSection(&g_crs);
iRet = send(skClient, msg, sizeof(msg)/sizeof(char), 0);
if (iRet == SOCKET_ERROR)
{
myPrintf(">>> client send fail
");
break;
}
FD_ZERO(&rFSet);
FD_SET(skClient, &rFSet);
iRet = select(skClient + 1, &rFSet, NULL, NULL, NULL);
if (iRet <= 0)
{
myPrintf(">>> client select fail
");
break;
}
memset(msg, 0, sizeof(msg)/sizeof(char));
iRet = recv(skClient, msg, sizeof(msg)/sizeof(char), 0);
if (iRet == SOCKET_ERROR)
{
myPrintf(">>> client recv fail
");
break;
}
if (strcmp(msg, "quit") == 0)
{
myPrintf(">>> client quit
");
break;
}
else
{
myPrintf(">>> client recv: %s
", msg);
}
}
closesocket(skClient);
end:
myPrintf(">>> client exit
");
WSACleanup();
return 0;
}
unsigned __stdcall ServerProc(void* param)
{
WSADATA wsData;
int iRet = WSAStartup(MAKEWORD(2, 2), &wsData);
if (iRet != 0)
{
myPrintf("server WSAStartup fail
");
return 1;
}
char msg[1024]={0};
int len = sizeof(SOCKADDR_IN);
SOCKET skServer, skClient;
fd_set rfSet;
skServer = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
SOCKADDR_IN addrServer, addrClient;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(6000);
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
iRet = bind(skServer, (const sockaddr*)&addrServer, sizeof(addrServer));
if (iRet != 0)
{
myPrintf(">>> server bind fail
");
goto end;
}
iRet = listen(skServer, 5);
if (iRet == -1)
{
myPrintf(">>> server listen fail
");
goto end;
}
SetEvent(g_hEvent);
skClient = accept(skServer, (sockaddr*)&addrClient, &len);
if (skClient == -1)
{
myPrintf(">>> no client connect to server
");
goto end;
}
myPrintf(">>> client %d connect to server success
", skClient);
while (true)
{
FD_ZERO(&rfSet);
FD_SET(skClient, &rfSet);
iRet = select(skClient + 1, &rfSet, NULL, NULL, NULL);
if (iRet <= 0)
{
myPrintf(">>> server select fail
");
break;
}
memset(msg, 0, sizeof(msg)/sizeof(char));
iRet = recv(skClient, msg, sizeof(msg)/sizeof(char), 0);
if (iRet == SOCKET_ERROR)
{
myPrintf(">>> server recv fail
");
break;
}
else
{
myPrintf(">>> server recv: %s
", msg);
::EnterCriticalSection(&g_crs);
myPrintf(">>> server please input command: ");
memset(msg, 0, sizeof(msg)/sizeof(char));
scanf("%s", msg);
::LeaveCriticalSection(&g_crs);
iRet = send(skClient, msg, sizeof(msg)/sizeof(char), 0);
if (iRet == SOCKET_ERROR)
{
myPrintf(">>> server send fail
");
break;
}
}
}
end:
closesocket(skServer);
WSACleanup();
myPrintf(">>> server exit
");
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
InitializeCriticalSection(&g_crs);
g_hEvent = CreateEventA(NULL, TRUE, FALSE, "MMClient##Event");
HANDLE hClient = (HANDLE)_beginthreadex(NULL, 0, ClientProc, NULL, 0, NULL);
HANDLE hServer = (HANDLE)_beginthreadex(NULL, 0, ServerProc, NULL, 0, NULL);
WaitForSingleObject(hClient, INFINITE);
WaitForSingleObject(hServer, INFINITE);
system("@pause");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.