基于TCP的Socket编程

来源:互联网 发布:ubuntu traceroute6 编辑:程序博客网 时间:2024/05/17 09:25
服务器端程序:1.加载套接字库(wsastartup);2.创建套接字(socket);3.将套接字绑定到本地IP和端口(bind);4.将套接字设为监听模式(listen),等待客户端的请求到来;5.客户端的请求到来时接收连接(accept);6.用返回的套接字和客户端进行通信(send/recv);7.关闭套接字 客户端程序:1.加载套接字库(wsastartup);2.创建套接字(socket);3.向服务器发出连接请求(connect);4.和服务器进行通信(send/recv);5.关闭套接字 服务器源代码:  // Server.cpp : Defines the entry point for the console application.
//
#include "winsock2.h"
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int  main()
{
 cout << "//////////////////服务器////////////////////////" << endl;
 //加载套接字动态库
 WSADATA wsaData; //WSADATA变量
 if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
 {
  cout << "WSAStartup failed!" << endl;
  return -1;
 }
 
 //创建套接字
 SOCKET sServer; //服务器套接字
 sServer = socket(AF_INET, SOCK_STREAM,0); 
 if(INVALID_SOCKET == sServer)
 {
  cout << "socket failed!" << endl;
  closesocket(sServer); //关闭套接字
  WSACleanup();           //释放套接字资源;
  return  -1;
 }
 
 //设置服务器地址
 SOCKADDR_IN  addrServ;  //服务器地址
 addrServ.sin_family = AF_INET;
 addrServ.sin_port = htons(4999);
 addrServ.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//////////////////////////////////////////////////////////////////////////
 //绑定套接字
 int retVal; //返回值
 retVal = bind(sServer, (SOCKADDR*)&addrServ, sizeof(SOCKADDR));
 if(SOCKET_ERROR == retVal)
 { 
  cout << "bind failed!" << endl;
  closesocket(sServer); //关闭套接字
  WSACleanup();   //释放套接字资源;
  return -1;
 }
//////////////////////////////////////////////////////////////////////////// SOCKET   sClient;      //客户端套接字
 SOCKADDR_IN     addrClient;         //客户端地址
 const int BUF_SIZE = 64; char   recvBuf[BUF_SIZE]; //接收数据缓冲区
 char   sendBuf[BUF_SIZE];  //发送数据缓冲区
   //开始监听
 retVal = listen(sServer, 5);
 if(SOCKET_ERROR == retVal)
 {
  cout << "listen failed!" << endl;  
  closesocket(sServer); //关闭套接字
  WSACleanup();   //释放套接字资源;
  return -1;
 }
 
 //接受客户端请求
 int addrClientlen = sizeof(SOCKADDR);
 sClient = accept(sServer,(SOCKADDR*)&addrClient,&addrClientlen);
 if(INVALID_SOCKET == sClient)
 {
  cout << "accept failed!" << endl;  
  closesocket(sServer); //关闭套接字
  WSACleanup();   //释放套接字资源;
  return -1;
 }
 
 while(true)
 {
  //从客户端接收数据
  ZeroMemory(recvBuf, BUF_SIZE);
  recv(sClient, recvBuf, BUF_SIZE, 0);  
  if(recvBuf[0] == '0') break;
  cout << "从客户端接收的数据: " << recvBuf << endl;
  cout << endl;
 
  //向客户端发送数据
  ZeroMemory(sendBuf, BUF_SIZE);
  cout << "向客户端发送数据: ";
  cin >> sendBuf;
  cout << endl; 
  send(sClient, sendBuf, strlen(sendBuf), 0);
 }
 //退出
 closesocket(sClient); //关闭套接字
 
 WSACleanup();   //释放套接字资源;
 return 0;
}
   客户端源代码: 

// Server.cpp : Defines the entry point for the console application.
//

#include "winsock2.h"
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

int main()
{
 cout << "//////////////////客户端////////////////////////";
 
 //加载套接字动态库
 WSADATA wsaData; //WSADATA变量
 if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
 {
  cout << "WSAStartup failed!" << endl;
  return -1;
 }

 //创建套接字
 SOCKET sHost; //服务器套接字
 sHost = socket(AF_INET, SOCK_STREAM,0);
 if(INVALID_SOCKET == sHost)
 {
  cout << "socket failed!" << endl;
  closesocket(sHost);  //关闭套接字
  WSACleanup();        //释放套接字资源
  return  -1;
 }

 //设置服务器地址
 SOCKADDR_IN servAddr;       //服务器地址
 servAddr.sin_family =AF_INET;
 servAddr.sin_port = htons(4999);
 servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

////////////////////////////////////////////////////////////////////////////// 
 
 const int BUF_SIZE = 64;
 char bufSend[BUF_SIZE];     //发送数据缓冲区
 char bufRecv[BUF_SIZE];     //接收数据缓冲区
 int retVal;                 //返回值


 //连接服务器
 retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
 if(SOCKET_ERROR == retVal)
 {
  cout << "connect failed!" << endl;
  closesocket(sHost); //关闭套接字
  WSACleanup();       //释放套接字资源
  return -1;
 }
 while(true)
 {
  //向服务器发送数据
  ZeroMemory(bufSend, BUF_SIZE);
  cout << endl;
  cout << "向服务器发送数据:  ";
  cin >> bufSend;
  send(sHost, bufSend, strlen(bufSend), 0);

  //从服务器接收数据
  ZeroMemory(bufRecv, BUF_SIZE);
  recv(sHost, bufRecv,BUF_SIZE , 0); // 接收服务器端的数据
  cout << endl <<"从服务器接收的数据:"<< bufRecv;
  cout << endl;
 }

 //退出
 closesocket(sHost); //关闭套接字
 WSACleanup();       //释放套接字资源
 return 0;
}

 

/////////////////////////////////////////////////////////////////////////////

 

      
0 0
原创粉丝点击