Windows下C++服务端和客户端Socket通信简单代码

// Client.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winsock2.h"
#include 
#pragma comment(lib, "ws2_32.lib")
using namespace std;
BOOL	RecvLine(SOCKET s, char* buf);	//读取一行数据
int main(int argc, char* argv[])
{
	const int BUF_SIZE = 64;
	WSADATA			wsd;			//WSADATA变量
	SOCKET			sHost;			//服务器套接字
	SOCKADDR_IN		servAddr;		//服务器地址
	char			buf[BUF_SIZE];	//接收数据缓冲区
	char			bufRecv[BUF_SIZE];
	int				retVal;			//返回值
	
	//初始化套结字动态库
	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
	{
		cout << "WSAStartup failed!" << endl;
		return -1;
	}
	
	//创建套接字
	sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
	if(INVALID_SOCKET == sHost)
	{
		cout << "socket failed!" << endl;
		WSACleanup();//释放套接字资源
		return  -1;
	}
	//设置服务器地址
	servAddr.sin_family =AF_INET;
	servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	servAddr.sin_port = htons((short)4999);
	int	nServAddlen  = sizeof(servAddr);
	//连接服务器
	retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));	
	if(SOCKET_ERROR == retVal)
	{
		cout << "connect failed!" << endl;	
		closesocket(sHost);	//关闭套接字
		WSACleanup();		//释放套接字资源
		return -1;
	}
	while(true){
		//向服务器发送数据
		ZeroMemory(buf, BUF_SIZE);
		cout << " 向服务器发送数据:  ";
		cin >> buf;
		retVal = send(sHost, buf, strlen(buf), 0);
		if (SOCKET_ERROR == retVal)
		{
			cout << "send failed!" << endl;
			closesocket(sHost);	//关闭套接字
			WSACleanup();		//释放套接字资源
			return -1;
		}
		//RecvLine(sHost, bufRecv);
		recv(sHost, bufRecv,5 , 0);		// 接收服务器端的数据, 只接收5个字符
		cout << endl <<"从服务器接收数据:" << bufRecv;
	}
	//退出
	closesocket(sHost);	//关闭套接字
	WSACleanup();		//释放套接字资源
	return 0;
}

// Server.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#include 
using namespace std;
int _tmain(int argc, char* argv[])
{
 const int BUF_SIZE = 64;
 WSADATA	 wsd;	 //WSADATA变量
 SOCKET	 sServer;	 //服务器套接字
 SOCKET	 sClient;	 //客户端套接字
 SOCKADDR_IN	 addrServ;;	 //服务器地址
 char	 buf[BUF_SIZE];	//接收数据缓冲区
 char	 sendBuf[BUF_SIZE];//返回给客户端得数据
 int	 retVal;	 //返回值
 //初始化套结字动态库
 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
 {
  cout << "WSAStartup failed!" << endl;
  return 1;
 }
	
 //创建套接字
 sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
 if(INVALID_SOCKET == sServer)
 {
  cout << "socket failed!" << endl;
  WSACleanup();//释放套接字资源;
  return -1;
 }
	
 //服务器套接字地址 
 addrServ.sin_family = AF_INET;
 addrServ.sin_port = htons(4999);
 addrServ.sin_addr.s_addr = INADDR_ANY;  
 //绑定套接字
 retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
 if(SOCKET_ERROR == retVal)
 { 
  cout << "bind failed!" << endl;
  closesocket(sServer);	//关闭套接字
  WSACleanup();	 //释放套接字资源;
  return -1;
 }
	
 //开始监听 
 retVal = listen(sServer, 1);
 if(SOCKET_ERROR == retVal)
 {
  cout << "listen failed!" << endl;  
  closesocket(sServer);	//关闭套接字
  WSACleanup();	 //释放套接字资源;
  return -1;
 }
	
 //接受客户端请求
 sockaddr_in addrClient;
 int addrClientlen = sizeof(addrClient);
 sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);
 if(INVALID_SOCKET == sClient)
 {
  cout << "accept failed!" << endl;  
  closesocket(sServer);	//关闭套接字
  WSACleanup();	 //释放套接字资源;
  return -1;
 }
	
 while(true){
  //接收客户端数据
  ZeroMemory(buf, BUF_SIZE);
  retVal = recv(sClient, buf, BUF_SIZE, 0);
  if (SOCKET_ERROR == retVal)
  {
   cout << "recv failed!" << endl;  
   closesocket(sServer);	//关闭套接字
   closesocket(sClient);	//关闭套接字  
   WSACleanup();	 //释放套接字资源;
   return -1;
  }
  if(buf[0] == '0')
   break;
  cout << "客户端发送的数据: " << buf <> sendBuf;
  
  send(sClient, sendBuf, strlen(sendBuf), 0);
 }
	
 //退出
 closesocket(sServer);	//关闭套接字
 closesocket(sClient);	//关闭套接字
 WSACleanup();	 //释放套接字资源;
	
 return 0;
}


你可能感兴趣的:(计算机网络)