Socket编程基础——面向连接TCP
WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口。WinSock包含两个主要版本,即WinSock1和WinSock2,在vs2010环境下,通常使用WinSock 2.2实现网络通信的功能。
1、Socket接口启动
需要引入头文件winsock2.h
及库文件ws2_32.lib
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
cout<<"Init error"<<endl;
return -1;
}
WSAStartup
函数原型如下:int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData)
(1)wVersionRequested
:Socket接口版本号,例如2.2版本(MAKEWORD(2,2)
),高位字节存储副版本号,低位字节存储主版本号;
(2)lpWSAData
:指向WSADATA
结构体的指针,WSADATA
结构体返回Socket信息;
如果上面函数执行成功,则返回0,否则可以通过WSAGetLastError()
查看错误代码。例如:WSAEINVAL
表示指定的Windows Socket版本不被该DLL支持。
2、IP地址的表示形式
对普通用户而言,IP地址使用点分法表示("192,168.0.1"字符串),但在计算机中不会使用这种方式,因为这样会浪费存储空间。实际上,计算机使用长整型存储IP地址,分为网络字节序和主机字节序。
(1)网络字节序
在网络传输过程中,IP地址保存为32位二进制,TCP/IP规定,在低位存储地址中保存数据的高位字节,这种存储顺序称为网络字节顺序,所以数据的传输由高位至低位进行的。不同网络设备和操作系统在发送数据之前都需要将二进制数据转为网络字节序。
(2)IP地址结构体
通用结构
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
常用结构
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
struct in_addr
就是32位IP地址。
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
};
使用inet_addr
和inet_ntoa
这两个函数可以实现点分IP地址字符串和网络字节序IP地址之间的转换。unsigned long inet_addr(const char *cp)
:点分字符串->s_addr
char FAR * inet_ntoa(struct in_addr in)
:in_addr(sin_addr)
->点分字符串
(3)主机字节序
可以使用htonl()
,htons()
,ntohl()
,ntohs()
这四个函数来实现主机字节顺序和网络字节顺序的转换。
3、服务器端通信流程
(1)创建服务器套接字
server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
指定IP地址族、SOCKET类型,协议,返回SOCKET
(2)绑定本地端口、IP
sockaddr_in sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port=htons(9000);
sAddr.sin_addr.S_un.S_addr=htonl(ADDR_ANY);
bind(server,(sockaddr*)&sAddr,sizeof(sAddr));
(3)监听等待连接
listen(server,5);
(4)接收连接,返回Socket
sockaddr_in cAddr;
int len=sizeof(cAddr);
client=accept(server,(sockaddr*)&cAddr,&len);
(5)接收数据
ZeroMemory(buf,BUF_SIZE);
recv(client,buf,BUF_SIZE,0);
buf
为缓冲区,BUF_SIZE
是缓冲区的大小;ZeroMemory
函数将缓冲区置0,替代memset
函数。
(6)发送数据
send(client,buf,strlen(buf),0);
在接收过程中接收大小写成缓冲区大小,发送时写成发送的数据大小!
4、客户端通信流程
(1)创建客户端套接字
client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
(2)连接服务器
cAddr.sin_port=htons(9000);
cAddr.sin_family=AF_INET;
cAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
retVal=connect(client,(sockaddr*)&cAddr,sizeof(cAddr));
(3)发送数据/接收数据
同服务器端
5、清理
(1)shutdown
禁止制定的Socket上发送和接收数据int shutdown(SOCKET s,int how)
参数s
表示要关闭的Socket,当参数how
被设置为SD_RECEIVE
时,不允许再次调用recv
接收数据,设置为SD_SEND
时,不允许再次调用send
发送数据,设置为SD_BOTH
时,不允许发送和接受数据。
(2)closesocket
(3)WSACleanup
Socket编程基础——面向连接TCP的更多相关文章
- Windows下C语言的Socket编程例子(TCP和UDP)
原文:Windows下C语言的Socket编程例子(TCP和UDP) 刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket程序例子,开发环境是vc6: 首先是TCP server端: ...
- socket编程基础-字节序/IP/PORT转换/域名
socket编程基础 网络IP操作函数 字符串的IP和32位的IP转换 #include <sys/socket.h> #inlcude <netinet/in.h> #inc ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- java socket编程基础(转)
一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- Java Socket编程基础篇
原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...
- 网络编程基础之TCP编程学习(一)
网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socke ...
- c#socket编程基础
Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...
- C# Socket编程(5)使用TCP Socket
TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...
- Socket编程实践(6) --TCP服务端注意事项
僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...
随机推荐
- Linux -- 文件统计常用命令
标签(空格分隔): Linux sort -- 文件内排序命令 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次比较其ASCII码. 按每行升序排序: sort seq.tx ...
- 前端工程师的PS默认工作区
右侧依次是信息.图层.历史记录,如下图:
- MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User,Pas ...
- C语言复杂声明
C语言复杂声明 First step int *f(); /* f:是一个函数,它返回一个指向int类型的指针*/ int (*pf)(); /* pf:是一个指向函数的指针,该函数返回一个int类型 ...
- 【转】IP分片和TCP分段
ZC: 由于 TCP中 MSS 的关系,TCP 不会造成 IP分片和TCP分段 ! 1.http://zhidao.baidu.com/link?url=YCnR8B-1EN4-cgauRtwa-iV ...
- poj2280Amphiphilic Carbon Molecules(极角排序)
链接 卡了几天的破题,对于hdu的那份数据,这就一神题.. 借助极角排序,枚举以每一个点进行极角排序,然后构造两条扫描线,一个上面一个下面,两条同时走,把上线和下线的点以及上线左边的点分别统计出来,如 ...
- spring+mybatis
---恢复内容开始--- 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地 ...
- Monkey测试的策略和分析
Monkey测试针对不同的对象和不同的目的采用不同的测试方案,首先测试的对象.目的及类型如下: 测试的类型分为:应用程序的稳定性测试和压力测试 测试对象分为:单一apk和apk集合 测试的目的分为:解 ...
- 【转】 void与void*详解
void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...
- ssh和putty
SH(Secure Shell的缩写),由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠,专为远程 ...