套接字(服务器/客户端) 框架 C++参考代码

140.143.91.57

ws2_32.lib

服务器Sever:
1、初始化套接字WSAStartup
2、创建socket()
3、绑定套接字和端口bind
4、监听该端口listen()  //
5、接收来自客户端的链接请求accept //接收connect()请求
6、从socket中读取数据recv()
7、closesocket()关闭套接字

客户端(Client)
1、初始化套接字WSAStartup
2、创建socket()
3、connect链接到服务器指定端口
4、send()向套接字发送数据
5、closesocket()关闭套接字


// Socket_Server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
        //1加载套接字库
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;

        wVersionRequested = MAKEWORD( 2, 2 );

        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 ) {//表示初始化不成功
                /* Tell the user that we could not find a usable */
                /* WinSock DLL.                                  */
                //return 0;
                printf("加载套接字库出错 \n");
        }
        //2创建一个套接字 供使用
        SOCKET ServerSocket;
        //3、向服务器发出连接请求(connect)。
        SOCKADDR_IN socksin;
        socksin.sin_family=AF_INET;
        socksin.sin_port=htons(6688);//服务器端口
        socksin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置绑定的IP地址 

192.168.1.111
        //printf("%04X \n",htonl(0x668899AA));
        ServerSocket=socket(AF_INET,SOCK_STREAM,0);
         int rf=connect(ServerSocket,(SOCKADDR*)&socksin,sizeof(socksin));
        while(1)
        {        

  if (rf==SOCKET_ERROR)
  {
          printf("未成功连接到服务器\n");
          closesocket(ServerSocket);
          ServerSocket=socket(AF_INET,SOCK_STREAM,0);
          rf=connect(ServerSocket,(SOCKADDR*)&socksin,sizeof(socksin));
           Sleep(1000);
                
  }else
  {
          printf("成功连接到服务器\n");
          char *ps="客户端数据来了 yjxsoft.com\n";
          char s[256];
          gets(s);
           ps=s;
          send(ServerSocket,ps,strlen(ps),0);
          //接收数据
          recv(ServerSocket,ps,256,0);
          printf("Client:%s 来自服务器 ErrorCode=%08X\n",ps,WSAGetLastError());
  }
    //continue while
  }
        closesocket(ServerSocket);
        WSACleanup();
        return 0;
}


// Socket_Server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
        //1加载套接字库
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;

        wVersionRequested = MAKEWORD( 2, 2 );

        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 ) {//表示初始化不成功
        
                printf("WSAStartup初始化出错 \n");
                getchar();
                return 1;
        }
  //2创建一个套接字 供使用
        SOCKET ServerSocket=socket(AF_INET,SOCK_STREAM,0);
  //3、将套接字绑定到一个本地地址和端口上(bind)
        SOCKADDR_IN socksin;
        socksin.sin_family=AF_INET;
        socksin.sin_port=htons(6688);
        socksin.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//设置绑定的IP地址 192.168.1.111
   //printf("%04X \n",htonl(0x668899AA));
   bind(ServerSocket,(SOCKADDR*)&socksin,sizeof(socksin));
        //        4、将套接字设为监听模式,准备接收客户请求(listen)
   listen(ServerSocket,4);


        //        5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接

的套接字(accept)
   SOCKADDR_IN clientsin;
  int len=sizeof(SOCKADDR_IN);
  //5、保存客户端的 套接字句柄clientSocket
  //等待客户端连接
  SOCKET clientSocket= accept(ServerSocket,(SOCKADDR*)&clientsin,&len); //单线程  单个客户


  while(1)
  {



        //        6、用返回的套接字和客户端进行通信(send/recv)
        //        7、返回,等待另一客户请求 回到第5步
  char s[256]={0};
  recv(clientSocket,s,256,0);
  if (stricmp(s,"exit")==0)
  {
          return 0;//退出服务端程序
  }
  printf("Client Data:%s \n ",s);

  printf("wait input:");
  char strMsg[1024];
  scanf("%s",strMsg);
  send(clientSocket,strMsg,strlen(strMsg)+2,0);


  } //end while
   closesocket(ServerSocket);
   WSACleanup();
        return 0;
}









//多线程版 服务器
// Socket_Server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
//套接字处理回调
DWORD WINAPI threadProc(LPVOID parg)
{
        SOCKET clientSocket=(SOCKET)parg;
        while(1)
        {



                //        6、用返回的套接字和客户端进行通信(send/recv)
                //        7、返回,等待另一客户请求 回到第5步
                char s[256]={0};
                recv(clientSocket,s,256,0);
                if (stricmp(s,"exit")==0)
                {
                        return 0;//退出服务端程序
                }
                printf("Client Data:%s \n ",s);

                printf("wait input:");
                char strMsg[1024];
                scanf("%s",strMsg);
                send(clientSocket,strMsg,strlen(strMsg)+2,0);


        } //end while
        
}
int _tmain(int argc, _TCHAR* argv[])
{
        //1加载套接字库
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;

        wVersionRequested = MAKEWORD( 2, 2 );

        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 ) {//表示初始化不成功
        
                printf("WSAStartup初始化出错 \n");
                getchar();
                return 1;
        }
  //2创建一个套接字 供使用
        SOCKET ServerSocket=socket(AF_INET,SOCK_STREAM,0);
  //3、将套接字绑定到一个本地地址和端口上(bind)
        SOCKADDR_IN socksin;
        socksin.sin_family=AF_INET;
        socksin.sin_port=htons(6688);//设置端口
        socksin.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//设置绑定的IP地址 192.168.1.111
   //printf("%04X \n",htonl(0x668899AA));
   bind(ServerSocket,(SOCKADDR*)&socksin,sizeof(socksin));
        //        4、将套接字设为监听模式,准备接收客户请求(listen)
   listen(ServerSocket,4);


        //5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接

字(accept)
   SOCKADDR_IN clientsin;
  int len=sizeof(SOCKADDR_IN);
  //5、保存客户端的 套接字句柄clientSocket
  //等待客户端连接
  SOCKET clientSocket= 0;//accept(ServerSocket,(SOCKADDR*)&clientsin,&len); //单线程  单个

客户端
   while(1)
   {
           clientSocket= accept(ServerSocket,(SOCKADDR*)&clientsin,&len); //单线程  单个客

户端
           ::CreateThread(0,0,threadProc,(LPVOID)clientSocket,0,0);
   }
   closesocket(ServerSocket);
   WSACleanup();
        return 0;
}

猜你喜欢

转载自blog.csdn.net/yedehei_lt/article/details/80656903