基于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协议. 网络编程的目的就是指直接或 ...
随机推荐
- Android Intent 解析之二
服务端Intent运行过程: Sticky:这个类型的BroadCast表示某些Intent须要被保留,当新的应用起来后,须要关注这个消息,可是呢,又不须要启动这个应用来接收此消息,比方耳机插入等消息 ...
- opencv kmeans 图像分割
利用kmeans算法,将彩色图像的像素点作为样本,rgb值作为样本的属性, 对图像所有的像素点进行分类,从而实现对图像中目标的分割. c++代码(openCV 2.4.11) Scalar color ...
- BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )
先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...
- hdu 4736 This Is The Job The Bear Finds(2013年成都ACM网络赛)
// Time 1718 ms; Memory 1500 K #include<iostream> #include<cstdio> #include<cmath> ...
- HDU 3033 分组背包
给出N个物品.M金钱.W种类 给出N个物品的性质:所属种类,花费.价值 求每一种类物品至少一个的前提下,所能购买到的最大价值 dp[i][k]表示在第i种物品.总花费为k的最大价值 dp[i][k]= ...
- sql基础,必须会的————随便整理、杂乱无章
1.sqlserver2008r2的安装 2.数据库与表的建立.增加.删除.修改. 3,索引的概念,包括聚集与非聚集的区别.全文索引的建立与如何使用全文索引. 4,重新生成索引,重新组织索引. 5,建 ...
- UItableViewCell上的button点击无响应的办法
由于IOS7中添加了滑动后出现编辑按钮的操作,所以使用scrollView来处理,UITableViewCellScrollView有对触摸的相应处理,导致按钮的点击效果被屏蔽了,但是点击事件还是在的 ...
- Java中的位运算符、移位运算
一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&) :两位全为1,结果为1,否则为0: (2)按位或 (|) :两位有一个为1,结果为1,否则为0: (3) ...
- 【转载】CentOS日志系统组成详解
日志系统有三部分组成:一.使用什么工具记录系统产生的日志信息? syslog服务脚本管理的两个进程: syslogd.klogd 来记录系统产生的日志信息: klogd 进 ...
- 一些Xcode 5的使用提示和技巧
摘自:http://www.cocoachina.com/newbie/env/2014/0127/7766.html 感谢论坛成员郭亚鑫的热心翻译. 在iOS开发中,Xcode 是最使用最多的I ...