Windows基于TCP的Socket编程

服务器端程序:

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值