vs2010下網絡編程創建套接字連接例子

建立win32控制檯項目,然後新建cpp文件

server:

#include "WinSock2.h" 
 #include "stdio.h" 
 #pragma comment(lib,"Ws2_32.lib")//導入庫,lib表示庫," "表示庫的名稱 
 
 int main(int argc, CHAR* argv[]) 
 { 
      //加載WinSock庫 
       WORD wVersionRequested; 
     WSADATA wsaData; 
     int err; 
  
     wVersionRequested = MAKEWORD( 2, 2 ); 
  
      err = WSAStartup( wVersionRequested, &wsaData ); 
     if ( err != 0 ) 
         return 0; 
      if ( LOBYTE( wsaData.wVersion ) != 2 || 
           HIBYTE( wsaData.wVersion ) != 2 ) { 
              WSACleanup( ); 
               return 0;  
      } 
  
       SOCKET lSocket,aSocket; 
     SOCKADDR_IN AddrSer; 
     AddrSer.sin_family=AF_INET; 
      AddrSer.sin_port=htons(5000); 
      AddrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY表示接受任何機器的請求 
      lSocket=socket(AF_INET,SOCK_STREAM,0); 
     //綁定服務器地址 
       if(::bind(lSocket,(SOCKADDR*)&AddrSer,sizeof(SOCKADDR))==SOCKET_ERROR) 
     { 
            printf("綁定套接字失敗"); 
            return 0; 
        } 
     ::listen(lSocket,1);//開始監聽客戶端的連接請求 
     SOCKADDR_IN AddrCli;//客戶端的地址信息 
     int len=sizeof(SOCKADDR); 
      aSocket=::accept(lSocket,(SOCKADDR*)&AddrCli,&len);//連接成功時,產生新的socket用來與客戶端通信 
     char recBuf[1024]; 
     char senBuf[1024]; 
      while (1) 
       { 
            //TCP下爲recv與send,UDP下爲recefrom與sendto 
             ::recv(aSocket,recBuf,1024,0); 
            if (recBuf[0]=='#') 
             { 
                  printf("客戶端請求斷開\n"); 
                printf("正在斷開..."); 
                 Sleep(3000); 
           break; 
                   } 
           printf("客戶端:%s\n",recBuf); 
            printf("服務器:"); 
            gets_s(senBuf);//warming:gets()is unsafe 
           if (senBuf[0]=='#') 
            { 
                ::send(aSocket,senBuf,1024,0); 
                  printf("正在請求斷開...\n"); 
                 Sleep(3000); 
                 return 0; 
             } 
            //printf("服務器:%s\n",senBuf); 
            ::send(aSocket,senBuf,1024,0); 
            memset(recBuf,' ',1024); 
           memset(senBuf,' ',1024); 
       } 
      ::closesocket(aSocket); 
      ::closesocket(lSocket); 
     ::WSACleanup(); 
      return 0; 
  } 
編輯運行

再建立客戶端項目 client,新建文件client.cpp

代碼爲:


#include "WinSock2.h"
#include "stdio.h"
#pragma comment(lib,"Ws2_32.lib")

 int main(int argc, CHAR* argv[])
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;

 wVersionRequested = MAKEWORD( 2, 2 );

 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 )
  return 0;
 if ( LOBYTE( wsaData.wVersion ) != 2 ||
  HIBYTE( wsaData.wVersion ) != 2 ) {
   WSACleanup( );
   return 0;
 }

 SOCKET cSocket;
 cSocket=socket(AF_INET,SOCK_STREAM,0);
 SOCKADDR_IN addrSer;
 addrSer.sin_family=AF_INET;
 addrSer.sin_port=htons(5000);
 addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 if(::connect(cSocket,(SOCKADDR*)&addrSer,sizeof(SOCKADDR))==SOCKET_ERROR)
 {
  printf("連接服務器失敗");
  return 0;
 }
 char senBuf[1024];
 char recBuf[1024];
 while(1)
 { 
  printf("客戶端:");
  gets_s(senBuf);
  if (senBuf[0]=='#')
  {
   ::send(cSocket,senBuf,1024,0);
   printf("正在請求斷開...\n");
   Sleep(3000);
   return 0;
  }
  //printf("客戶端:%s\n",senBuf);
  ::send(cSocket,senBuf,1024,0);
  ::recv(cSocket,recBuf,1024,0);
  if(recBuf[0]=='#')
  {
   printf("與服務器斷開");
   printf("正在斷開...");
   Sleep(3000);
   break;
  }
  printf("服務器:%s\n",recBuf);
  memset(recBuf,' ',1024);
  memset(senBuf,' ',1024);
 }
 ::closesocket(cSocket);
 ::WSACleanup();
 return 0;
}

 

編輯運行。

然後呢,先啓動server.exe,再啓動client.exe 好了 可以簡單地會話了,自己給自己聊天吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章