初识网络编程
2016-03-13 19:44
141 查看
网络编程就是编写程序使两台连网的计算机相互交换数据。
套接字时网络数据传输用的软件设备。
首先构建接电话套接字
调用socket函数(安装电话机)
#include<sys/socket.h>
int socket(int domain, int type, int protocol); //成功时返回文件描述符,失败时返回-1
调用bind函数(分配电话号码)
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); //成功时返回0,失败时返回-1
调用listen函数(连接电话线)
int listen(int sockfd, int backlog); //成功时返回0,失败时返回-1
调用accept函数(拿起话筒)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //成功时返回文件描述符,失败时返回-1
网络编程中接受连接请求的套接字创建过程整理如下:
第一步:调用socket函数创建套接字
第二步:调用bind函数分配IP地址和端口号
第三步:调用listen函数转为可接收请求状态
第四步:调用accept函数受理连接请求
打电话(请求连接)
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); //成功时返回0,失败时返回-1
客户端程序:
1.调用socket函数和connect函数
2.与服务器端共同运行以收发字符串数据
注意:Linux系统下不区分套接字和文件
在这里我们经常看到ssize_t、size_t这种数据类型(size_t是通过typedef声明的unsigned int类型,对于ssize_t来说,前面的s代表signed,所以,ssize_t代表signed int
),这些属于元数据类型,在sys/types.h头文件中一般由typedef声明定义,算是给大家熟悉的基本数据类型起了别名。那么为什么要这样做呢?
因为随着时代的变化,系统的不同,数据类型的表现也不一样。以前的操作系统int是16位的,现在大多是32位的。所以在不同的操作系统上,只需修改size_t和ssize_t的typedef声明即可。为了与程序员定义的新数据类型加以区分,操作系统定义的数据类型会添加后缀_t。
Windows下网络编程
为windows套接字编程设置头文件和库
为了在Winsock基础上开发网络程序,需要做如下准备。
导入头文件winsock2.h
链接ws2_32.lib
那么如何导入库呢,这个嘛先记录一下,因为还木有visual studio。通过visual studio 打开项目属性页->配置属性->(->链接器->)输入->附加依赖项,然后就导入头文件就好了。
Winsock的初始化
进行Winsock编程时,首先必须调用WSAStartup函数,设置程序中用到的Winsock版本,并初始化相应版本的库。
#include<winsock2.h>
int WSAStartup(WORD, wVersionRequested, LPWSADATA lpWSAData); //成功时返回0,失败时返回非零的 错误代码值
对于上面两个参数的详细说明以下。第一个,Winsock中存在多个版本,应准备WORD类型(WORD是通过typedef定义的unsigned short类型)套接字版本信息,传递给该函数的第一个参数。若版本为1.2,其中1是主版本号,2是副版本号,应传递0x0201。高八位为副版本号,低八位为主版本号。可以通过MAKEWORD宏函数构建版本信息。
MAKEWORD(1, 2); // return 0x0201
第二个,lpWSADATA,此参数需传入WSADATA型结构体变量地址(lpWSADATA是WSADATA的指针类型),调用完函数后,相应参数中将填充已初始化的库信息。
那么如何注销该库
int WSACleanup(void);//成功返回0,失败时返回SOCKET_ERROR
调用该函数时Winsock相关库将归还Windows操作系统,无法再调用Winsock相关函数。无需调用Winsock函数时才调用该函数,通常在程序结束之前调用。
基于Windows的套接字相关函数
#include<winsock2.h>
SOCKET socket(int af, int type, int protocol); //成功返回套接字句柄,失败时返回INVALID_SOCKET
bind函数分配IP地址和端口号
int bind(SOCKET s, const struct sockaddr *name, int namelen); //成功返回0,失败时返回SOCKET_ERROR
listen函数调用套接字可接收客户端连接
int listen(SOCKET s, int backlog); //成功返回0,失败时返回SOCKET_ERROR
accept调用受理客户端连接请求
SOCKET accept(SOCKET s,struct sockaddr *addr, int *addrlen); //成功返回套接字句柄,失败时返回INVALID_SOCKET
从客户端发送连接请求
int connect(SOCKET s, const struct sockaddr *name, int namelen); //成功返回0,失败时返回SOCKET_ERROR
关闭套接字时使用,windows区分套接字和文件,,所以有专门关闭套接字的函数
int closesocket(SOCKET s); //成功返回0,失败时返回SOCKET_ERROR
要注意在windows下,文件句柄相关函数和套接字句柄相关函数是有区别的。
Winsock数据传输函数
int send(SOCKET s, const char *buf, int len, int flags); //成功时返回传输字节数,失败时返回SOCKET_ERROR
int recv(SOCKET s, const char *buf, int len, int flags); //成功时返回传输字节数,失败时返回SOCKET_ERROR
套接字时网络数据传输用的软件设备。
首先构建接电话套接字
调用socket函数(安装电话机)
#include<sys/socket.h>
int socket(int domain, int type, int protocol); //成功时返回文件描述符,失败时返回-1
调用bind函数(分配电话号码)
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); //成功时返回0,失败时返回-1
调用listen函数(连接电话线)
int listen(int sockfd, int backlog); //成功时返回0,失败时返回-1
调用accept函数(拿起话筒)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //成功时返回文件描述符,失败时返回-1
网络编程中接受连接请求的套接字创建过程整理如下:
第一步:调用socket函数创建套接字
第二步:调用bind函数分配IP地址和端口号
第三步:调用listen函数转为可接收请求状态
第四步:调用accept函数受理连接请求
打电话(请求连接)
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); //成功时返回0,失败时返回-1
客户端程序:
1.调用socket函数和connect函数
2.与服务器端共同运行以收发字符串数据
注意:Linux系统下不区分套接字和文件
在这里我们经常看到ssize_t、size_t这种数据类型(size_t是通过typedef声明的unsigned int类型,对于ssize_t来说,前面的s代表signed,所以,ssize_t代表signed int
),这些属于元数据类型,在sys/types.h头文件中一般由typedef声明定义,算是给大家熟悉的基本数据类型起了别名。那么为什么要这样做呢?
因为随着时代的变化,系统的不同,数据类型的表现也不一样。以前的操作系统int是16位的,现在大多是32位的。所以在不同的操作系统上,只需修改size_t和ssize_t的typedef声明即可。为了与程序员定义的新数据类型加以区分,操作系统定义的数据类型会添加后缀_t。
Windows下网络编程
为windows套接字编程设置头文件和库
为了在Winsock基础上开发网络程序,需要做如下准备。
导入头文件winsock2.h
链接ws2_32.lib
那么如何导入库呢,这个嘛先记录一下,因为还木有visual studio。通过visual studio 打开项目属性页->配置属性->(->链接器->)输入->附加依赖项,然后就导入头文件就好了。
Winsock的初始化
进行Winsock编程时,首先必须调用WSAStartup函数,设置程序中用到的Winsock版本,并初始化相应版本的库。
#include<winsock2.h>
int WSAStartup(WORD, wVersionRequested, LPWSADATA lpWSAData); //成功时返回0,失败时返回非零的 错误代码值
对于上面两个参数的详细说明以下。第一个,Winsock中存在多个版本,应准备WORD类型(WORD是通过typedef定义的unsigned short类型)套接字版本信息,传递给该函数的第一个参数。若版本为1.2,其中1是主版本号,2是副版本号,应传递0x0201。高八位为副版本号,低八位为主版本号。可以通过MAKEWORD宏函数构建版本信息。
MAKEWORD(1, 2); // return 0x0201
第二个,lpWSADATA,此参数需传入WSADATA型结构体变量地址(lpWSADATA是WSADATA的指针类型),调用完函数后,相应参数中将填充已初始化的库信息。
那么如何注销该库
int WSACleanup(void);//成功返回0,失败时返回SOCKET_ERROR
调用该函数时Winsock相关库将归还Windows操作系统,无法再调用Winsock相关函数。无需调用Winsock函数时才调用该函数,通常在程序结束之前调用。
基于Windows的套接字相关函数
#include<winsock2.h>
SOCKET socket(int af, int type, int protocol); //成功返回套接字句柄,失败时返回INVALID_SOCKET
bind函数分配IP地址和端口号
int bind(SOCKET s, const struct sockaddr *name, int namelen); //成功返回0,失败时返回SOCKET_ERROR
listen函数调用套接字可接收客户端连接
int listen(SOCKET s, int backlog); //成功返回0,失败时返回SOCKET_ERROR
accept调用受理客户端连接请求
SOCKET accept(SOCKET s,struct sockaddr *addr, int *addrlen); //成功返回套接字句柄,失败时返回INVALID_SOCKET
从客户端发送连接请求
int connect(SOCKET s, const struct sockaddr *name, int namelen); //成功返回0,失败时返回SOCKET_ERROR
关闭套接字时使用,windows区分套接字和文件,,所以有专门关闭套接字的函数
int closesocket(SOCKET s); //成功返回0,失败时返回SOCKET_ERROR
要注意在windows下,文件句柄相关函数和套接字句柄相关函数是有区别的。
Winsock数据传输函数
int send(SOCKET s, const char *buf, int len, int flags); //成功时返回传输字节数,失败时返回SOCKET_ERROR
int recv(SOCKET s, const char *buf, int len, int flags); //成功时返回传输字节数,失败时返回SOCKET_ERROR
相关文章推荐
- C++中STL迭代器的种类和简介http://blog.csdn.net/woshifeixingzhuiyue/article/details/7376308
- 一个 Http 请求
- 深入理解C++中的mutable关键字 http://no001.blog.51cto.com/1142339/389840/
- TCP粘包/拆包问题的解决
- TCP四次握手释放连接
- HTTP 2.0的那些事
- 模拟恶劣网络环境常用的几种解决方案
- C++模板之特化与偏特化详解 http://www.jb51.net/article/56004.htm
- Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧 http://www.cnblogs.com/kanego/archive/2012/08/15/2639761.htm
- HTTP stub_status 模块
- 图片url中包含中文导致网络请求404
- 函数模板(Function Template)及带默认参数的函数 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25520556&id
- 理解HTTP消息头 (四)
- 理解HTTP消息头 (三)
- 理解HTTP消息头 (二)
- 网络爬虫学习一
- 初识HTTP消息头
- 网络流学习笔记
- TCP三次握手建立连接
- DNS使用的是TCP协议还是UDP协议(转)