WSASocket写的简单的C/S端

  1. http://blog.csdn.net/lu1012123053/article/details/8199795

  1. /* 
  2. * 服务器端 
  3. */  
  4.   
  5. #include   <Winsock2.h>     
  6. #include   <stdio.h>     
  7. #include   <iostream.h>   
  8. #pragma comment(lib,"Ws2_32.lib")    
  9.        
  10. SOCKET   sockSvc;//服务器端socket  
  11. SOCKET   sockConnect;   //连接用的socket  
  12.       
  13. DWORD WINAPI RecvData(LPVOID   lpParameter);  //接收线程的函数   
  14.       
  15. int main()     
  16. {     
  17.   WORD   wVersionRequested;//定义socket1.1或者socket2.0     
  18.   WSADATA   wsaData;   //定义装载socket版本的变量  
  19.   int   err;   //错误变量  
  20.       
  21.   wVersionRequested = MAKEWORD(2,2);   //定义连接为socket2.0  
  22.       
  23.   err  =  WSAStartup(wVersionRequested, &wsaData);   //装载socket2.0支持  
  24.   if(0 != err)//判断是否装载成功  
  25.   {     
  26.     return -1;     
  27.   }     
  28.   
  29.   if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)//判断版本号,是否和定义的一样  
  30.   {     
  31.      WSACleanup();   //若出问题,卸载支持,并结束程序返回-1  
  32.      return -1;       
  33.   }     
  34.       
  35.   sockSvc = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);  
  36.   /**//* 
  37.    
  38.     SOCKET WSASocket(int af, int type, int protocol, 
  39.                  LPWSAPROTOCOL_INFO lpprotocolinfo, 
  40.                  GROUP g, DWORD dwflags) 
  41.  
  42.     SOCKET socket(int af, int type, int protocol) 
  43.     参数:地址族,套接字类型和协议类型 
  44.           这三个因素共同决定了创建套接字的服务提供者 
  45.      
  46.     传输服务提供者实现的功能包括建立连接,传输数据,实现流控制和差错控制等函数。 
  47.     Ws2_32.dll在应用程序和服务提供者之间实现了媒介的功能 
  48.  
  49.   
  50.   第一 
  51.       socket()和WSASocket()函数都能返回一个SOCKET套接字; 
  52.       socket()主要实现同步传输,Socket库中例程在应用于阻塞套接口时会阻塞。 
  53.       WSASocket()用于异步传输,WSASocket()的发送操作和接收操作都可以被重叠使用。 
  54.        
  55.       WSASocket()的接收函数可以被多次调用,发出接收缓冲区,准备接收到来的数据。 
  56.                  发送函数也可以被多次调用,组成一个发送缓冲区队列。 
  57.       socket()却只能发过之后等待回消息才可做下一步操作! 
  58.   其次     
  59.       WSASocket()所支持的版本如下:    
  60.                         Version:   Requires   Windows   Sockets2.0.    
  61.                         Header:   Declared   in   Winsock2.h.    
  62.       socket()所支持老一些的版本,如Windows   Sockets1.0和    
  63.                         Version:   Requires Windows   Sockets1.1 
  64.   */  
  65.       
  66.   SOCKADDR_IN  addrSvc; //服务器地址信息   
  67.   addrSvc.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //0 接收所有数据包    
  68.   addrSvc.sin_family   =  AF_INET;     
  69.   addrSvc.sin_port  =  htons(4000);//监听 端口  
  70.       
  71.   bind(sockSvc,(SOCKADDR*)&addrSvc,sizeof(SOCKADDR)); //绑定服务和端口    
  72.       
  73.   listen(sockSvc,50);     
  74.   /**//* 
  75.     int listen(SOCKET s, int users);  
  76.     服务程序可以调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维 
  77.     护一个客户连接请求队列,该队列最多容纳users个客户连接请求。假如该函数执行成功, 
  78.     则返回0;如果执行失败,则返回SOCKET_ERROR。 
  79.   */  
  80.       
  81.   SOCKADDR_IN   addrClient;     
  82.   int length = sizeof(SOCKADDR);     
  83.       
  84.   while(1)     
  85.   {     
  86.   sockConnect = accept(sockSvc, (SOCKADDR*)&addrClient,&length);   
  87.   /**//* 
  88.    SOCKET accept(  
  89.       SOCKET s,  
  90.       struct sockaddr FAR *addr,  
  91.       int FAR *addrlen  
  92.    );  
  93.    服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求, 
  94.    并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符, 
  95.    以后与客户套接字交换数据的是新创建的套接字;如果失败就返回 INVALID_SOCKET。该函数的第一个参数 
  96.    指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用 
  97.    第三个参数来返回新创建的套接字的地址结构的长度。 
  98.   */  
  99.   if(INVALID_SOCKET != sockConnect)     
  100.   {     
  101.       HANDLE   hThread;     
  102.       hThread=CreateThread(NULL,0,RecvData,(LPVOID)sockConnect,0,NULL);   
  103.       /**//* 
  104.       /* 
  105.       我们得定义一个句柄用来存放它的返回值。还定义一个指向线程ID的DWORD值dwThreadId。 
  106.         CreateThread函数有六个参数分别是 
  107.          LPSECURITY_ATTRIBUTES lpThreadAttributes,  // pointer to security attributes 
  108.          DWORD dwStackSize,                         // initial thread stack size 
  109.          LPTHREAD_START_ROUTINE lpStartAddress,     // pointer to thread function 
  110.          LPVOID lpParameter,                        //argument for new thread 
  111.          DWORD dwCreationFlags,                     // creation flags 
  112.          LPDWORD lpThreadId                         // pointer to receive thread ID 
  113.       中第一个参数我们设置为NULL,使这个句柄不能被继承;第二个参数设置为0,使用默认的堆栈 
  114.       大小;第三个参数为线程函数的起始地址,也就是线程函数的函数名;第四个参数要传递给线程 
  115.       函数的值;第五个参数为0,创建好之后马上让线程运行;第六个参数设置为指向线程ID的地址。 
  116.       严格来说这里需要加错误检测if(NULL == hThead){} 
  117.       */  
  118.       CloseHandle(hThread);     
  119.   }     
  120.   }     
  121.       
  122.   Sleep(INFINITE);     
  123.   closesocket(sockConnect);     
  124.   WSACleanup();  // 严格来说这里需要加错误检测if(0 != WSACleanup()){}  
  125.   }     
  126.       
  127.   DWORD   WINAPI   RecvData(LPVOID   lpParameter)  //线程接收函数    
  128.   {     
  129.   SOCKET   socket   =   (unsigned  int)lpParameter;     
  130.   char   recvBuffer[1024];     
  131.   for(;;)     
  132.   {     
  133.   //receive   data   from   client     
  134.   if(SOCKET_ERROR == recv(socket, recvBuffer, 1024, 0)) //和客户端的send相对应    
  135.   {     
  136.      cout<<"The   receive   data   defeat   or   was   the   client   side   already   withdraws\n"<<endl;     
  137.      break;     
  138.   }     
  139.   cout<<"Client says: "<<recvBuffer<<endl;     
  140.   }     
  141.   closesocket(socket);   // 严格来说这里需要加错误检测if(0 != closesocket(socket)){}  
  142.   return  0;     
  143. }     


 

[cpp]  view plain  copy
  1. *  
  2. * 客户端  
  3. */  
  4.   
  5. #include<Winsock2.h>     
  6. #include<stdio.h>     
  7. #pragma comment(lib,"Ws2_32.lib")  
  8.   
  9. void main()     
  10. {     
  11.   WORD   wVersionRequested;     
  12.   WSADATA   wsaData;     
  13.   int   err;     
  14.       
  15.   wVersionRequested = MAKEWORD(2, 2);     
  16.       
  17.   err = WSAStartup(wVersionRequested, &wsaData);     
  18.   if(err != 0){     
  19.      return;     
  20.   }     
  21.       
  22.       
  23.   if(LOBYTE(wsaData.wVersion) != 2 ||  
  24.      HIBYTE(wsaData.wVersion) != 2 ){     
  25.        
  26.       WSACleanup();     
  27.       return;       
  28.   }     
  29.   
  30.   SOCKET sockClient = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);  
  31.   SOCKADDR_IN   addrClient;   //服务器地址信息  
  32.   addrClient.sin_addr.S_un.S_addr = inet_addr("192.168.94.37");   //要连接的服务地址  
  33.   addrClient.sin_family = AF_INET; //协议族    
  34.   addrClient.sin_port = htons(4000);  //请求的端口   
  35.       
  36.   char  sendBuffer[1024];   //每次发送的最大数据量  
  37.   connect(sockClient, (SOCKADDR*)&addrClient, sizeof(SOCKADDR));//连接服务器端     
  38.   while(true)     
  39.   {     
  40.     /**//*send   data   to   service*/     
  41.     printf("Please   input   data:\n");     
  42.     if(gets(sendBuffer) == NULL)  //输入要发送的数据   
  43.     break;     
  44.     else     
  45.     {     
  46.       if(SOCKET_ERROR == send(sockClient,sendBuffer,  
  47.           strlen(sendBuffer)+1,0)) //TCP方式发送    
  48.       {     
  49.          printf("Transmission data defeat!\n");     
  50.          break;     
  51.       }     
  52.     }     
  53.   }     
  54.   closesocket(sockClient);    // 严格来说这里需要加错误检测if(0 != closesocket(socket)){}  
  55.   WSACleanup();     
  56. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值