【通信方式五】socket编程之TCP通信
2017-07-11 23:35
337 查看
1、网络字节序
网络字节序就是熟知的关于大小端的问题,关于前面的大小端的判断方法,以及代码实现再此就不在赘述,下面只谈网络中的字节序问题
(如何判定当前机器的大小端:http://blog.csdn.net/double_happiness/article/details/71480861)
发送方主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络中接收到的字节依次保存在接受缓冲区中,也是暗中内存从低地址到高地址的顺序进行保存,因此网络数据流的地址是这样规定的:先发出的数据是低地址,后发出的是高地址,即网络数据采取大端字节序。
Linux下的网络字节序和主机字节序的转换
2、socket地址的数据类型及相关函数
socketaddr数据结构
从上面数据结构的设计,不管对应的是IPv4、IPv6还是UNIX,只要取得这种socket结构体的首地址,而不需要知道具体是那种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容,因此socket API可以接受各种类型的sockaddr结构体指针做参数,底层直接使用void*类型以便接受各种类型的指针,因此这些函数的参数都用struct socketaddr*类型表示,在传递参数时需要进行强制类型转化。
(1)字符串转in_addr函数
服务器端通过调用socket(),bind(),listen()创建监听套接字,然后通过accept()从网络中能不断的监听获取新的连接,完成对应的数据传输。服务器端分别模拟单进程,多进程,多线程的情况。
客户端只需要要创建套接字,然后调用connect连接到服务器端完成数据的传输任务即可。
相关函数
(1)socket函数——创建socket套接字
参数说明:
domain:The domain argument specifies a communication domain; this selects the protocol family which will be used for communication.
type:
protocol:默认缺省为0
返回值:创建成功返回新创建的socket的文件描述符,创建失败返回-1;
(2)bind函数
参数说明:
socket:socket的成功返回值
addr:struct sockaddr结构体指针变量,该结构体图已经在上面给出
addrlen:addr的有效长度
返回值:成功返回0失败返回-1
(3)listen函数
参数说明:
socket:socket函数的成功返回值
backlog:是一个整数,一般不能给太大
返回值:成功返回0失败返回-1
(4)accept函数
参数说明:
sockfd:socket函数的成功范湖值
addr:struct sockaddr结构体指针变量(客户端的IP和port)
addrlen:addr的有效长度
返回值:成功返回0失败返回-1
(5)connect函数
参数说明:
sockfd:socket函数的成功范湖值
addr:struct sockaddr结构体指针变量(服务器端的IP和port)
addrlen:addr的有效长度
返回值:成功返回0失败返回-1
代码实现
客户端的实现都是不变的,对应的只需要修改服务器端相应的代码即可,由于多进程的程序需要多台主机再此就不给出演示,只给出相关代码
单进程server.c
客户端client.c
运行演示
多进程代码实现
多线程版本代码实现
网络字节序就是熟知的关于大小端的问题,关于前面的大小端的判断方法,以及代码实现再此就不在赘述,下面只谈网络中的字节序问题
(如何判定当前机器的大小端:http://blog.csdn.net/double_happiness/article/details/71480861)
发送方主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络中接收到的字节依次保存在接受缓冲区中,也是暗中内存从低地址到高地址的顺序进行保存,因此网络数据流的地址是这样规定的:先发出的数据是低地址,后发出的是高地址,即网络数据采取大端字节序。
Linux下的网络字节序和主机字节序的转换
#include<arpa/inet.h> unit32_t htonl(uint32_t hostlong); unit16_t htonl(uint16_t netshort); unit32_t ntohl(uint32_t netlong); unit16_t ntohl(uint16_t netshort);其中hton系列的都是主机序列转为网络序列,ntoh的都是网络序列转化为主机序列。
2、socket地址的数据类型及相关函数
socketaddr数据结构
从上面数据结构的设计,不管对应的是IPv4、IPv6还是UNIX,只要取得这种socket结构体的首地址,而不需要知道具体是那种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容,因此socket API可以接受各种类型的sockaddr结构体指针做参数,底层直接使用void*类型以便接受各种类型的指针,因此这些函数的参数都用struct socketaddr*类型表示,在传递参数时需要进行强制类型转化。
(1)字符串转in_addr函数
#include <arpa/inet.h> int inet_aton(const char* str,struct in_addr *addr); in_addr_t inet_addr(const char* str); int inet_pton(int family,const char* str,void* addr);(2)in_addr转字符串的函数
char* inet_ntoa(struct in_addr inaddr); const char* inet_ntop(int family,const void* addr,char* str,size_t len);3、TCP通信流程
服务器端通过调用socket(),bind(),listen()创建监听套接字,然后通过accept()从网络中能不断的监听获取新的连接,完成对应的数据传输。服务器端分别模拟单进程,多进程,多线程的情况。
客户端只需要要创建套接字,然后调用connect连接到服务器端完成数据的传输任务即可。
相关函数
(1)socket函数——创建socket套接字
#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);
参数说明:
domain:The domain argument specifies a communication domain; this selects the protocol family which will be used for communication.
Name Purpose Man page AF_UNIX, AF_LOCAL Local communication unix(7) AF_INET IPv4 Internet protocols ip(7) AF_INET6 IPv6 Internet protocols ipv6(7) AF_IPX IPX - Novell protocols AF_NETLINK Kernel user interface device netlink(7) AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7) AF_AX25 Amateur radio AX.25 protocol AF_ATMPVC Access to raw ATM PVCs AF_APPLETALK Appletalk ddp(7) AF_PACKET Low level packet interface packet(7)
type:
protocol:默认缺省为0
返回值:创建成功返回新创建的socket的文件描述符,创建失败返回-1;
(2)bind函数
#include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数说明:
socket:socket的成功返回值
addr:struct sockaddr结构体指针变量,该结构体图已经在上面给出
addrlen:addr的有效长度
返回值:成功返回0失败返回-1
(3)listen函数
#include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog);
参数说明:
socket:socket函数的成功返回值
backlog:是一个整数,一般不能给太大
返回值:成功返回0失败返回-1
(4)accept函数
#include <sys/types.h> #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数说明:
sockfd:socket函数的成功范湖值
addr:struct sockaddr结构体指针变量(客户端的IP和port)
addrlen:addr的有效长度
返回值:成功返回0失败返回-1
(5)connect函数
#include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数说明:
sockfd:socket函数的成功范湖值
addr:struct sockaddr结构体指针变量(服务器端的IP和port)
addrlen:addr的有效长度
返回值:成功返回0失败返回-1
代码实现
客户端的实现都是不变的,对应的只需要修改服务器端相应的代码即可,由于多进程的程序需要多台主机再此就不给出演示,只给出相关代码
单进程server.c
客户端client.c
运行演示
多进程代码实现
多线程版本代码实现
相关文章推荐
- unix环境IPC通信之socket(三),tcp采用并发服务器编程实例,多进程方式 4000
- 网络通信中标志通信进程、TCP三次握手四次撒手、TCP与UDP在socket编程中的区别
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- 基于tcp_socket通信的网络编程
- python网络编程之TCP通信实例和socketserver框架
- Linux socket编程入门及客户端服务器端通信实现 – 提高篇:TCP连接过程分析
- tcp通信:多进程共享listen socket方式
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- 【转】TCP Socket编程-客户端和服务端双向通信
- java分布式开发TCP/IP NIO无阻塞 Socket((基于消息方式实现系统间的通信) )(转)
- Socket 通信原理 -- Android客户端和服务器以TCP&&UDP方式互通
- python网络编程之TCP通信实例和socketserver框架使用例子
- java网络编程(一) socket方式TCP和Datagram的UDP
- android 开发之socket编程 UDP和TCP通信实现
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 简单TCP Socket 通信
- vxworks下socket编程 TCP 通信
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- C#网络编程笔记(1) -- TCP Socket通信基本过程和思路
- Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天