今天在看socket - -
套接字I/O模型好几种哈
先小小的总结下:
套接字模式:阻塞模式 (处理大量套接字严重不方便)
和 非阻塞模式
套接字I/O模型
阻塞模型
Select模型
WSAAsyncSelect模型等等。。。
先发下单线程阻塞模式 (月姐提供)
客户端
#include <stdio.h>
#include <tchar.h>
#include <WinSock2.h>
#pragma comment(lib,"WS2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
SOCKET sClinet;
sockaddr_in addrClient;
int iResult;
char buf[128];
char ServerIP[32];
ZeroMemory(ServerIP,32);
printf("Please input server's IP:");
scanf("%s",ServerIP);
//初始化
if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
{
printf("WSAStartuo failed!");
return 1;
}
//连接Scocket
sClinet = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sClinet == INVALID_SOCKET)
{
printf("socket failed!");
WSACleanup();
return -1;
}
//连接服务器
addrClient.sin_family = AF_INET;
addrClient.sin_port = htons(9990);
addrClient.sin_addr.S_un.S_addr = inet_addr(ServerIP);
int addrlen = sizeof(addrClient);
iResult = connect(sClinet,(const sockaddr*)&addrClient,sizeof(addrClient));
if (iResult == SOCKET_ERROR)
{
printf("connect failed!");
closesocket(sClinet);
WSACleanup();
return -1;
}
printf("Please begin to chat\n");
//消息接收
while(1)
{
ZeroMemory(buf,128);
printf("Please input a string to send:");
scanf("%s",buf);
iResult = send(sClinet,buf,sizeof(buf),0);
if (iResult == SOCKET_ERROR)
{
printf("send failed!");
closesocket(sClinet);
WSACleanup();
return -1;
}
ZeroMemory(buf,128);
iResult = recv(sClinet,buf,sizeof(buf)+1,0);
printf("Recv From Server: %s\n",buf);
if (strcmp(buf,"quit") == 0 || strcmp(buf,"结束") == 0)
{
iResult = send(sClinet,"quit",strlen("quit"),0);
break;
}
}
closesocket(sClinet);
WSACleanup();
system("Pause");
return 0;
}
服务端
#include <stdio.h>
#include <tchar.h>
#include <WinSock2.h>
#pragma comment(lib,"WS2_32.lib")
int _tmain()
{
WSADATA wsaData;
SOCKET sServer;
SOCKET sClinet;
sockaddr_in addrServer;
sockaddr_in addrClient;
int iResult;
char buf[128];
//初始化
if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
{
printf("WSAStartuo failed!");
return 1;
}
//连接Socket
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sServer == INVALID_SOCKET)
{
printf("socket failed!");
WSACleanup();
return -1;
}
//bind绑定IP和端口
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(9990);
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
iResult = bind(sServer,(const struct sockaddr*)&addrServer,sizeof(SOCKADDR_IN));
if (iResult == SOCKET_ERROR)
{
printf("bind failed!");
closesocket(sServer);
WSACleanup();
return -1;
}
//监听Socket
iResult = listen(sServer,1);
if (iResult == SOCKET_ERROR)
{
printf("listen failed!");
closesocket(sServer);
WSACleanup();
return -1;
}
printf("Tcp Server start...\n");
//等待接收,如果客户端不发包,则一直监听
int addrClientlen = sizeof(addrClient);
sClinet = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);
if (sClinet == INVALID_SOCKET)
{
printf("accept failed!");
closesocket(sServer);
WSACleanup();
return -1;
}
printf("Please begin to chat\n");
//消息循环
while(1)
{
ZeroMemory(buf,128);
iResult = recv(sClinet,buf,BUFSIZ,0);
if (iResult == SOCKET_ERROR)
{
printf("recv failed!");
closesocket(sServer);
closesocket(sClinet);
WSACleanup();
return -1;
}
//添加本地时间
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
char strDateTime[30];
sprintf(strDateTime,"%4d-%2d-%2d %2d:%2d:%2d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
printf("%s,Recv From Client [%s:%d] :%s\n",strDateTime,inet_ntoa(addrClient.sin_addr),addrClient.sin_port,buf);
//等待quit,则结束消息接收
if (strcmp(buf,"quit") == 0 || strcmp(buf,"结束") == 0)
{
iResult = send(sClinet,"quit",strlen("quit"),0);
break;
}
else
{
ZeroMemory(buf,128);
printf("Please input a string to send:");
scanf("%s",buf);
iResult = send(sClinet,buf,strlen(buf),0);
if (iResult == SOCKET_ERROR)
{
printf("send failed!");
closesocket(sServer);
closesocket(sClinet);
WSACleanup();
return -1;
}
}
}
//结束清理
closesocket(sServer);
closesocket(sClinet);
WSACleanup();
system("Pause");
return 0;
}