在新建的 C++源文件中编写如下代码。

1.TCP 服务器端
#include<winsock2.h> //包含头文件
#include<stdio.h>
#include<windows.h>
#pragma comment(lib,"WS2_32.lib") //显示连接套接字库
int main() //主函数开始
{
WSADATA data; //定义 WSADATA 结构体对象,WSADATA结构被用来储存调用AfxSocketInit全局函数返回  Windows Sockets初始化信息。这个结构被用来存储被                                    //WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。

WORD w=MAKEWORD(2,0); //定义版本号码,WORD是微软SDK中的类型,WORD的意思为字,是2byte的无符号整数,表示范围0~65535.
char sztext[]="欢迎你\r\n"; //定义并初始化发送到客户端的字符数组
::WSAStartup(w,&data); //初始化套接字库,本函数必须是应用程序或DLL调用的第一个Windows Sockets函数.它允许应用程序或DLL指明Windows Sockets API的版本号及                                    //获得特定Windows Sockets实现的细节.应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数.

SOCKET s,s1; //定义连接套接字和数据收发套接字句柄
s=::socket(AF_INET,SOCK_STREAM,0); //创建 TCP 套接字,socket()向应用程序提供创建套接字的手段,DOS、WINDOWS中仅支持AF_INET,它是网际网区域。TCP流式                                                            //套接字(SOCK_STREAM)提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收.如果调用                                                          //者不希望特别指定使用的协议,则置为0,使用默认的连接模式。
sockaddr_in addr,addr2; //定义套接字地址结构
int n=sizeof(addr2); //获取套接字地址结构变量大小
addr.sin_family=AF_INET; //初始化地址结构
addr.sin_port=htons(75);//将主机的无符号短整形数转换成网络字节顺序,sin_port:指Socket对应的端口号。

addr.sin_addr.S_un.S_addr=INADDR_ANY;//addr.sin_addr.S_un.S_addr是SOCKET编程中的一个结构体,用来指定IP地址的。INADDR_ANY就是指定地址为                                                                        //0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。
::bind(s,(sockaddr*)&addr,sizeof(addr)); //绑定套接字。

/*int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen);
参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name 是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namelen表明了name的长度.如果没有错误发生,bind()返回0。否则返回SOCKET_ERROR。*/

::listen(s,2); //监听套接字

/*int PASCAL FAR listen(SOCKET s, int backlog);
参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。*/

printf("服务器已经启动\r\n"); //输出提示信息
while(true)
{
s1=::accept(s,(sockaddr*)&addr2,&n); //接受连接请求

/*SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen);
参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。addr 指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址族决定。addrlen 为客户方套接字地址的长度(字节数)。如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。*/

if(s1!=NULL)
{
printf("%s 已经连接上\r\n",inet_ntoa(addr2.sin_addr));

/*char FAR * inet_ntoa( struct in_addr in);将一个IP转换成一个互联网标准点分格式的字符串。*/
::send(s1,sztext,sizeof(sztext),0); //向客户端发送字符数组

/*int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags);
参数s为已连接的本地套接字描述符。buf 指向存有发送数据的缓冲区的指针,其长度由len 指定。flags 指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。*/

}
::closesocket(s); //关闭套接字句柄
::closesocket(s1);
::WSACleanup(); //释放套接字库
if(getchar()) //如果有输入则关闭程序
{
return 0; //正常结束程序
}
else
{::Sleep(100);
}
}}
2. TCP 客户端

#include<winsock2.h> //包含头文件
#include<stdio.h>
#include<windows.h>
#pragma comment(lib,"WS2_32.lib") //显式连接套接字库
int main() //主函数开始
{
WSADATA data; //定义 WSADATA 结构体对象
WORD w=MAKEWORD(2,0); //定义版本号码
::WSAStartup(w,&data); //初始化套接字库
SOCKET s; //定义连接套接字和数据收发套接字句柄
char sztext[10]={0};
s=::socket(AF_INET,SOCK_STREAM,0); //创建 TCP 套接字
sockaddr_in addr;//定义套接字地址结构
addr.sin_family=AF_INET; //初始化地址结构
addr.sin_port=htons(75);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

/*127.0.0.1是回送地址,指本地机,一般用来测试使用。回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。*/
printf("客户端已经启动\r\n");//输出提示信息
::connect(s,(sockaddr*)&addr,sizeof(addr));

/*int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen);
参数s是欲建立连接的本地套接字描述符。参数name指出说明对方套接字地址结构的指针。对方套接字地址长度由namelen说明。*/

::recv(s,sztext,sizeof(sztext),0);

/*int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags);
参数s 为已连接的套接字描述符。buf指向接收输入数据缓冲区指针,其长度由len 指定。flags 指定传输控制方式,如是否接收带外数据等。如果没有错误发生,recv()返回总共接收的字节数。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。*/  

printf("%s\r\n",sztext);
::closesocket(s); //关闭套接字句柄
::WSACleanup(); //释放套接字库
if(getchar()) //如果有输入则关闭程序
{
return 0; //正常结束程序
}
else
{::Sleep(100);
}
}

【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。的更多相关文章

  1. 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。

    1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...

  2. (二)通过fork编写一个简单的并发服务器

    概述 那么最简单的服务端并发处理客户端请求就是,父进程用监听套接字监听,当有连接过来时那么监听套接字就变成了已连接套接字(源和目的的IP和端口都包含了),这时候就可以和客户端通信,但此时其他客户端无法 ...

  3. 编写一个简单的java服务器程序

    import java.net.*;import java.io.*; public class server{ ); //监听在80端口 Socket sock = server.accept(); ...

  4. c#编写一个简单的http服务器

    先来张我的帅照哈哈哈 好了不臭美了   上代码 世间万物 只有想不到 没有做不到  哈哈哈  仔细阅读代码     我要凑够 150个字  哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ...

  5. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

  6. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  7. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  8. Python网络编程——编写一个简单的回显客户端/服务器应用

    今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端.采用python3.5版本,在注释中会标明python2和python3的不同之处. 1.代码 ( ...

  9. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

随机推荐

  1. grunt -- javascript自动化工具

    grunt 是一个基于npm,node.js 用js编写的工具框架,可以自动完成一些重复性的任务(如合并文件,语法检查,压缩代码), grunt拥有庞大的插件库,可以满足各种自动化批处理需求,常用的插 ...

  2. Nopcommerce商城添加【满XX减XX优惠券】功能

    公司的电商网站要做个优惠券的功能,nop框架,但我接触nop时间不多,最后还是为了功能而完成了.这中间肯定有很多小问题. Nopcommerce自带的促销功能感觉不是很好,首先优惠券功能放在购物车页面 ...

  3. 装饰(Decorator)模式

    1.装饰(Decorator)模式    动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活.Component是定义一个对象接口.可以给这些对象动态地添加职责.Concre ...

  4. C# 截取字符串,区分中英文情况

    public static string SubstringByCN(string strInput, int begin, int length) { if (!Regex.IsMatch(strI ...

  5. 详解boost库中的Message Queue .

    Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅.消息队列中的消息由优先级.消息长度.消息数据三部 ...

  6. GET——token

    private function get_token(){ $appid="wx4dae5d61b7f9935c"; $appSecret="24a91315a1a62a ...

  7. PHPCMSV9 采集网址后,再采集内容,报错:“采集采集内容 没有找到网址列表,请先进行网址采集”

    解决方法:直接清除v9_collection_history 表里的内容.

  8. Ubuntu 12.04更换显示器后显示“显示不支援”,只能进恢复模式工作

    以前用的一台14寸液晶,换成17寸后,进入系统显示器上“显示不支援”  .仔细观查,电脑硬盘自检能显示后,后面都是黑屏. 解决过程. 因为grub 启动菜单不能显示.盲按方向键,发现菜单里的其它项目可 ...

  9. web前端知识

    4.表格与表单 4.1 动态添加行 <script language=”javascript”> window.onload=function(){ var oTr = document. ...

  10. 基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理

    上一篇博文简单介绍了下插件化的代码组成部分:http://www.cnblogs.com/gengzhe/p/4390932.html,源码地址:https://github.com/luohuazh ...