http://blog.csdn.net/guoguojune/archive/2011/02/15/6185301.aspx(原文的格式看着真叫一个舒服)

开发环境  Vs 2008  新建一个 win32 console  project

//  服务器端代码

// Server.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
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 <<endl;
cout << "向客户端发送数据: " ;
cin >> sendBuf;
send(sClient, sendBuf, strlen(sendBuf), 0);
}
//退出
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源;
return 0;
}
//  客户端代码
// Client.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winsock2.h"
#include <iostream>
#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;

C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信相关推荐

  1. socket服务器端和客户端通信——基础篇

    制作游戏自然离不开网络通信,我们在游戏中的聊天室该怎么做出来呢?这就需要用到scoket了,这里就只说明socket在游戏开发中如何使用,主要面对unity和c#. 首先需要建立两个项目,分别编写服务 ...

  2. java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)

    开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户 ...

  3. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  4. Java Socket服务器端与客户端的编程步骤总结

    一,InetAddress类: InetAddress类没有构造方法,所以不能直接new出一个对象: 可以通过InetAddress类的静态方法获得InetAddress的对象: InetAddres ...

  5. java实例练习——基于TCP/IP协议的多客户端通信

    先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...

  6. c++ socket服务器端和客户端实例(实现简单监控功能)

    服务器端 #include "stdafx.h" #include <opencv2/opencv.hpp> #include <WinSock2.h> # ...

  7. 双网卡服务器SOCKET编程指定客户端通信网卡

    网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题: 在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从 ...

  8. 一个 Java 的 Socket 服务器和客户端通信的例子

    http://blog.csdn.net/defonds/article/details/7971259 多个客户端对应一个服务端的通信的一个小例子.  服务端和客户端代码: public class ...

  9. 模拟jQuery ajax服务器端与客户端通信

    本案例通过jQuery和Servlet技术来判断用户名是否存在,让读者明白jQuery是怎么调用服务器后台的.还给出了解决中文乱码的方案和如何避免各种浏览器的缓存. 功能如下: 如果用户名为空提示&q ...

最新文章

  1. Nmap帮助文档解释
  2. EDM数据营销概念简要介绍
  3. 【BZOJ】3456: 城市规划 动态规划+多项式求逆
  4. 用C++11 实现 thread pool
  5. Delphi关于记录文件的操作
  6. 推荐系统的变与不变:冷启动、召回排序、长期生态与目标拆解
  7. 【知识图谱】Louvain、LPA等5类经典社区发现算法 Python 实战
  8. DSP2812开发板学习
  9. 无穷级数求和7个公式_数字、数论、数列、级数
  10. 解决图片放在src上面加载不出来,但是放在浏览器地址可以访问
  11. 专家不靠谱,秘笈才重要
  12. (HYSBZ - 4198)荷马史诗
  13. 学校机房计算机网络设计,建好高校机房 从设计上需掌握三大要素
  14. 12864c与语言字符显示,大家看看该怎么改才能让12864液晶显示屏显示21个字符啊?...
  15. Tomcat - 解决which must be escaped when used within the value错误
  16. 使用searx搭建自己的搜索引擎
  17. 新媒体管理师详解,新媒体矩阵搭建不完全指南
  18. brew cask install 解决慢的问题
  19. 《红海行动》之黑天鹅事件
  20. echarts渐变色不起作用

热门文章

  1. java finalize逃脱_JVM【第十三回】:【Java对象存活------finalize()方法】
  2. python unit test 访问开发代码_python unittest 源码分析
  3. android rtsp协议转http协议_网络协议HTTP 协议(一)
  4. go float64 转int_深挖Go函数之深度解析(下):可变参数
  5. MATLAB 长度和像素_MATLAB——单车道NaSch模型
  6. java多线程编程核心技术 pdf_Java多线程编程核心技术之volatile关键字
  7. 初中人教版电子课本app_电子课本|2020秋 部编人教版初中历史七年级上册教材电子课本(高清更新可打印)...
  8. 一文通吃所有整流滤波电路
  9. 基于verilog的FFT设计与实现
  10. bash 2_quantize.sh遇到错误2_quantize.sh: line 7: 29380 Segmentation fault解决方法