基于TCP/IP协议的C++网络编程(API函数版)
源代码:http://download.csdn.net/detail/nuptboyzhb/4169959
基于TCP/IP协议的网络编程
定义变量——获得WINSOCK版本——加载WINSOCK库——初始化——创建套接字 ——设置套接字选项——关闭套接字——卸载WINSOCK库——释放所有资源
整个程序架构分为两大部分,服务器端客户端。
服务器SOCKET程序流程:
socket()→bind()→listen→accept()→recv()/send()→closesocket()
客户端:
socket→bind()→connect()→send()/recv()→closesocket()
编程举例:
约定发送消息的格式为如下结构体:
typedef struct
{
int ID;
char data[255];
}TcpMessage;
应用程序的头文件如下:
#include <winsock2.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
端口号为:4500
服务器端:
1、 初始化:
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0)
return 0;
2、 创建套接字:
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
3、 使套接字和本地地址绑定
// 在sockaddr_in结构中装入地址信息
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4500); // htons函数将主机的无符号短整形数转换成网络
//字节顺序
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf(" bind error \n");
closesocket(sListen);
return 0;
}
4、监听端口
if(listen(sListen, 5) == SOCKET_ERROR)
{
printf("listen error\n");
closesocket(sListen);
return 0;
}
5、等待接受连接,(如无连接,一直等待)
SOCKET sClient;//用于保存accept返回的套接字
sClient = accept(sListen,0,0);//accept函数调用失败则继续等待连接。
if(sClient == INVALID_SOCKET)
{
printf("accept() error");
}
6、用第5步中accept函数返回的套接字进行收发通信
6.1、接收:(如果没有接到,会等待!)
TcpMessagerevData;//定义接收消息的结构体变量
int ret=recv(sClient,(char *)&revData,sizeof(revData),0);
if(ret>0)//说明,收到字节
{
switch (revData.ID)//对不同的ID,可以有不同的反应
{
case 1:
……..
case 2:
……..
}
}
6.2、发送:
TcpMessage sendData;
memset((char*)&sendData,0,sizeof(sendData));//初始化为0
sendData.ID=1;//为ID成员变量赋值
strcpy(sendData.data,"\r\n..要发送的字符信息 ");
if(send(sClient,(char*)&sendData,sizeof(sendData),0)==SOCKET_ERROR)
{
char error[10];
int errorcode=WSAGetLastError();
itoa(errorcode,error,10);
MessageBox(NULL,error,"发送失败,错误码为:",MB_OK);
printf("send error!");
}
7、关闭
closesocket(sClient);//由accept生成的套接字
closesocket(sListen);//服务端套接字
WSACleanup();
客户端
1、 初始化
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0)
return 0;
2、 创建套接字
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
3、 使套接字和本地地址绑定
// 在sockaddr_in结构中装入服务器端地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(4500);// htons函数将主机的无符号短整形数转换成网络
//字节顺序,4500端口为要连接服务器端的端口
servAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//服务器端ip
4、 连接服务器
if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
//注意,要先把服务器打开,否则连接失败
5、 收发通信
用send和recv函数,这一点和服务器端一样
6、 关闭
closesocket(sClient);//客户端只有一个连接套接字
WSACleanup();
基于TCP/IP协议的C++网络编程(API函数版)的更多相关文章
- 读书笔记——网络编程与开发技术(3)基于TCP/IP协议的网络编程相关知识
TCP/IP协议:数据链路层,网络层,传输层,应用层. IP地址分为5类:A类.B类.C类.D类.E类. (A类.B类.C类是基本类,D类多用于多播传送,E类为保留类.) "*"表 ...
- 标准C实现基于TCP/IP协议的文件传输
上学期集成程序设计的课堂作业,对于理解TCP/IP实现还是挺有帮助的. TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如 ...
- 标准C语言实现基于TCP/IP协议的文件传输
TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下: 1.Socket系统调用 为了进行网络I/O,服务器和客户机两 ...
- 网络通信-在浏览器输入url,基于TCP/IP协议,浏览器渲染的解释
知识点1: 网络模型 TCP/IP四层 和ISO七层模型 (统一省略后面层字.比如传输代表传输层) 知识点2: 在应用层中TCP建立连接,经历的三次握手协议 首先:,TCP协议是什么? 为什么要三次握 ...
- 【TCP/IP】之Java socket编程API基础
Socket是Java网络编程的基础,深入学习socket对于了解tcp/ip网络通信协议很有帮助, 此文讲解Socket的基础编程.Socket用法:①.主要用在进程间,网络间通信. 文章目录如下: ...
- 基于TCP/IP协议的socket通讯server
思路: socket必须要随项目启动时启动,所以需用Spring自带的监听器,需要保持长连接,要用死循环,所以必须另外起线程,不能阻碍主线程运行 1.在项目的web.xml中配置listener &l ...
- java实例练习——基于TCP/IP协议的多客户端通信
先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...
- 基于TCP/IP协议的socket通讯client
package com.ra.car.utils; import java.io.BufferedReader; import java.io.IOException; import java.io. ...
- 网络编程的基本概念,TCP/IP协议简介
8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...
随机推荐
- Codeforces 360C Levko and Strings dp
题目链接:点击打开链接 题意: 给定长度为n的字符串s,常数k 显然s的子串一共同拥有 n(n-1)/2 个 要求找到一个长度为n的字符串t,使得t相应位置的k个子串字典序>s #include ...
- OpenWRT推理client线上的数
有两种方法: 一. 经DHCP client通讯组列表 (缺点:client列表会依据超时时间刷新,一般超时时间为12h,) 二. 通过arp缓存列表/proc/net/arp(缺点:arp刷新时间默 ...
- POJ 3667 splay区间盘整运动
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 12446 Accepted: 5363 Descriptio ...
- 我写的一个 Qt 显示图片的控件
Qt 中没有专门显示图片的控件.通常我们会使用QLabel来显示图片.可是QLabel 显示图片的能力还是有点弱.比方不支持图像的缩放一类的功能.使用起来不是非常方便. 因此我就自己写了个简单的类. ...
- setInterval定义与调用
以下是一个倒计时,可以定义定时器为全局变量(ti2),或局部变量(ti). <script type="text/javascript" src="js/jquer ...
- Javascript常用函数收集(不定期更新)
str.replace('/正则表达式/','替换内容'); //正则替换str.match('/正则表达式/','替换内容'); //正则匹配 str.indexOf('查找代码'); //查找是否 ...
- x64栈结构
A function's prolog is responsible for allocating stack space for local variables, saved registers, ...
- bootstrap base css 基本css
Headings All HTML headings, <h1> through <h6> are available. h1. Heading 1 h2. Heading 2 ...
- CCIE路由实验(3) -- BGP高级部分
当一个AS包含多个IBGP对等体时,路由反射器非常有用.因为IBGP客户只需要和路由反射器建立邻居关系,从而降低了IBGP的连接数量.路由反射器和它的客户合称为一个簇.路由反射是克服IBGP水平分割的 ...
- A_全然背包
/* copyright: Grant Yuan algorithm: 全然背包 time : 2014.7.18 __________________________________________ ...