简单的客户/服务器程序(基于windows Socket API)

来源:互联网 发布:淘宝好评语通用 编辑:程序博客网 时间:2024/05/22 00:27

//服务器端

#include<stdio.h>
#include< winsock2.h>
#include<windows.h>
BOOL InitSock();//加载winsock第一个版本进行版本协商
int main()
{
 system("color 4f");
    InitSock();//加载winsock第一个版本进行版本协商
 //创建套接字

 SOCKET m_SrvSocket=socket(AF_INET,SOCK_STREAM,0);
 SOCKADDR_IN m_SrvAddr;
 m_SrvAddr.sin_addr .S_un .S_addr =htonl(INADDR_ANY);
 m_SrvAddr.sin_family =AF_INET;
 m_SrvAddr.sin_port =htons(1024);
 bind(m_SrvSocket,(SOCKADDR*)&m_SrvAddr,sizeof(SOCKADDR));//绑定端口号
    if(SOCKET_ERROR==listen(m_SrvSocket,10))//监听客户端的请求
 {
  ::MessageBox(NULL,"监听失败","failed",0);
  closesocket(m_SrvSocket);
     WSACleanup();
  return 0;
 }
 SOCKADDR_IN m_ClientAddr;
 int len=sizeof(SOCKADDR);
 char Buf[200];
 char Recv[200];
 char SendBuf[200];
 //SOCKET connect=accept(m_SrvSocket,(SOCKADDR*)&m_ClientAddr,&len);
 printf("我是服务器,开始聊天.../n");
 SOCKET connect=accept(m_SrvSocket,(SOCKADDR*)&m_ClientAddr,&len);//与客户端建立连接
  if(connect== INVALID_SOCKET )
  {
   ::MessageBox(NULL,"连接失败","ERROR",0);
   closesocket(m_SrvSocket);
         WSACleanup();
   return 0;
  }
     //closesocket(connect);
 while(1)
 { 
  
  recv(connect,Recv,200,0);
  //if('q'==Recv[0])
  if(!strcmp("quit",Recv))
  {
   sendto(m_SrvSocket,"quit",strlen("quit")+1,0,(SOCKADDR*)&m_ClientAddr,len);
   printf("Chat end!/n");
   break;
  }
  sprintf(Buf,"%s say : %s",inet_ntoa(m_ClientAddr.sin_addr),Recv);
  printf("%s/n",Buf);
  gets(SendBuf);
  send(connect,SendBuf,strlen(Buf)+1,0);
 }
 closesocket(connect);
 closesocket(m_SrvSocket);
 WSACleanup();
 return 0;
 
}
BOOL InitSock()
{
  //加载winsock第一个版本进行版本协商
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 1, 1 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  /* Tell the user that we could not find a usable */
  /* WinSock DLL.                                  */
  return false;
 }
 
 /* Confirm that the WinSock DLL supports 2.2.*/
 /* Note that if the DLL supports versions greater    */
 /* than 2.2 in addition to 2.2, it will still return */
 /* 2.2 in wVersion since that is the version we      */
 /* requested.                                        */
 
 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
  /* Tell the user that we could not find a usable */
  /* WinSock DLL.                                  */
  WSACleanup( );
  return false;
 }
 
 /* The WinSock DLL is acceptable. Proceed. */
 return true;
}