Socket 单线程阻塞模式

今天在看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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值