socket编程——一个简单的例子
来源:互联网 发布:java 单例模式 实例 编辑:程序博客网 时间:2024/04/30 15:47
从一个简单的使用TCP例子开始socket编程,其基本步骤如下:
server client
+++++++ ++++++++
创建socket 创建socket
+++++++ ++++++++
| |
| |
| |
+++++++ ++++++++
地址赋值( 地址赋值(
自己的地址) 服务器地址)
+++++++ ++++++++
| |
| |
| |
++++++++ |
用bind绑定 |
socket和地址 |
++++++++ |
| |
| |
| |
+++++++ |
listen |
+++++++ |
| ++++++++++
| <------------------------------ connect 服务器
| ++++++++++
+++++++ |
accept |
+++++++ |
| |
| +++++++++
| recv 和send
| 进行数据处理
| +++++++++
+++++++++ |
用accept得到 |
的socket进行 |
recv 和 send |
+++++++++ |
| |
| |
| |
+++++++++ +++++++++
close socket close socket
+++++++++ +++++++++
根据以上步骤,服务器端的代码为
客户端代码为:
现在一个简单的使用tcp的socket通信的例子已经完成了,这里有几个需要说明的问题
1)头文件:
sys/socket.h 包含了socket相关的函数,如socket,send 和recv, 以及struct sockaddr等
netinet/in.h 包含了地址结构,如struct sockaddr_in
errno.h 包含了errno 和 EINTR
syslog.h 包含了syslog相关的信息,其打印结果在/var/log/messages里面
2)socket地址
对于IPv4来说,其地址用的是struct sockaddr_in,具体结构如下
其中sin_len我们一般不关注,也不填(只有在使用routing socket的时候才用到,被内核用来处理各种协议簇的地址结构)。bind, connect, sendto, 和 sendmsg会把socket地址从程序传递给内核; 而accept, recvfrom, recvmsg, getpeername, 和 getsockname会把地址从内核传递给程序。因为不同协议簇的地址结构是不一样的,所以必须要有一个通用的指针来传递地址,对于ANSI C来说我们一般使用void *,但是socket产生早于ANSI C,所以也就没有使用这个机制,而是使用一个通用的地址结构struct sockaddr来处理的 IPv6的socket地址为struct sockaddr_in6 对于sockaddr-in6来说,我们不能用通用的地址struct sockaddr来存储了,而是产用新的通用地址结构struct sockaddr_storage,这个结构足够大可以存储任何系统支持的地址。 几种常见的地址结构3) 相关函数的的length对于从程序传地址给内核的函数(如connect),其长度是一个整型值,告诉内核要copy的地址长度。对于从内核传递给程序的函数(如accpt),其长度是一个整型指针,是一个value-result参数。有两个目的:一告诉内核地址结构的长度,让内核在copy的时候不要超过这个长度;二返回内核真正copy的长度。4)字节序socket相关的函数都是使用网络字节序5)地址转换函数inet_aton, inet_ntoa, and inet_addr把IPv4字符串地址转为32位的网络字节序地址inet_ptonand inet_ntop可以转换IPv4和IPv6的地址6)listen中的backlog要知道这个值的含义先用说一下,对于一个listen的socket,有两个队列:一个是incomplete connection队列(仅仅收到SYN);一个是complete connection队列(三次握手完成)。accept函数就是在complete connection队列中取一个socket。backlog就是指队列的个数,但不行的是各个地方都没有明确定义这个值,没有说明究竟代表了哪个队列,或是两个队列之和。一般来说可以同时处理的连接数是backlog的1.5倍,很多地方都用5.7) getsockname 和 getpeername这两个函数可以与socket关联的地址,getsockname 和 getpeername分别得到自己和对端的地址
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- 一个Socket网络编程的简单例子
- 一个简单的java socket编程例子
- 一个简单的socket例子
- 一个简单socket的例子
- 一个简单的socket例子
- win32 socket的一个简单的例子
- 非常简单的socket编程例子
- 一个关于linux socket的简单例子
- 一个最简单的Socket通信例子
- 一个最简单的socket通讯例子
- 一个关于linux socket的简单例子
- Android判断网络状态是否断开
- vs2005安装部署软件过程(转)
- for xml path(string)
- lo150笔记
- 经典水晶报表设计——纵向排列 + 多列格式化 + 设置“页边距”
- socket编程——一个简单的例子
- ORA-12170:TNS:接続タイムアウトが発生しました。
- 初探Sql Server 执行计划及Sql查询优化
- 非常不错的一个JS分页效果代码,值得研究
- redhat9文本模式更改系统默认语言
- 生 理 时 钟 说 明
- HTTP 错误 403.1 禁止访问:禁止执行访问错误处理
- 基于jQuery的js分页代码
- COBOL读写文件HELLOWORD-2