【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。
在新建的 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)); //绑定套接字。
::listen(s,2); //监听套接字
printf("服务器已经启动\r\n"); //输出提示信息
while(true)
{
s1=::accept(s,(sockaddr*)&addr2,&n); //接受连接请求
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); //向客户端发送字符数组
}
::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));
::recv(s,sztext,sizeof(sztext),0);
printf("%s\r\n",sztext);
::closesocket(s); //关闭套接字句柄
::WSACleanup(); //释放套接字库
if(getchar()) //如果有输入则关闭程序
{
return 0; //正常结束程序
}
else
{::Sleep(100);
}
}
【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。的更多相关文章
- 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。
1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...
- (二)通过fork编写一个简单的并发服务器
概述 那么最简单的服务端并发处理客户端请求就是,父进程用监听套接字监听,当有连接过来时那么监听套接字就变成了已连接套接字(源和目的的IP和端口都包含了),这时候就可以和客户端通信,但此时其他客户端无法 ...
- 编写一个简单的java服务器程序
import java.net.*;import java.io.*; public class server{ ); //监听在80端口 Socket sock = server.accept(); ...
- c#编写一个简单的http服务器
先来张我的帅照哈哈哈 好了不臭美了 上代码 世间万物 只有想不到 没有做不到 哈哈哈 仔细阅读代码 我要凑够 150个字 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ...
- 用 Go 编写一个简单的 WebSocket 推送服务
用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
- 编写一个简单的C++程序
编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- Python网络编程——编写一个简单的回显客户端/服务器应用
今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端.采用python3.5版本,在注释中会标明python2和python3的不同之处. 1.代码 ( ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
随机推荐
- codevs 1269 匈牙利游戏
/*暴力+乱搞 55分(似乎只有暴力得分了)*/ #include<iostream> #include<cstdio> #include<cstring> #in ...
- hdu 5124
bc上的题目,很水,有很多方法做吧,题意大概就是给定你票数,然后让你求出票数最多的那个下标...... 之前我用两个for循环分开写,一个是读入,然后是判断,提交就wa,后来网上看了别人的,就是不能分 ...
- aps.net 用ajax 读取服务端值
1.Default.aspx 页面内容 实例一: <%@ Page Language="C#" AutoEventWireup="true" Code ...
- javascript 广告移动特效
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- C++拾遗(七)函数相关(2)
内联函数 内联函数与常规函数的区别在于: 1.常规函数:在执行调用指令时,先存储该指令的内存地址,将函数参数复制到堆栈,然后跳转到被调用函数起点的内存单元,执行函数,将返回值放 入寄存器,最后跳回到一 ...
- uva 482 - Permutation Arrays
<int, double> --> <int, string> 从而避免了输出格式: #include <vector> #include <strin ...
- intent.setFlags方法中参数值的含义
intent.setFlags()方法中参数的含义 1.FLAG_ACTIVITY_NEW_TASK: 例如现在栈一的情况是:A B C(C位于栈顶),C通过intent跳转到D,并且这个I ...
- MySQL查询执行的基础
当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.一旦理解这一点,很多查询优化实际上就是遵循一些原则让优化器能够按照预想的合理的方式运行. 换句话说,是 ...
- part3
我就不刁旭概念什么的问题了哈~直接进入工作中所通用的一些有关object的方法和属性 1).for/in 属性的遍历~他遍历的对象没有特定的顺序,而且只能枚举出所有用户自定义的属性,不能枚举出某些预定 ...
- PHP自动添加http://头 转换网址为链接
有时候,当我们需要用户输入网址的时候,一般我们会让用户省略掉"http://",当提交完成后用代码自动再加上http://,若有需要,我们 还可将网址转换成链接的形式,类似于众多网 ...