转:socket 通信server+client的C++版

之前写过一次android的socket,最近用C++实现了windows下的客户端与服务器的聊天与传文件。

首先说一下什么是socket。socket(套接字)是一种独立于协议的网络编程接口,在OSI模型(对OSI七层模型不了解的自行Google)中主要集中于会话层和传输层。

详细来说,socket有四种类型:

  1. 字节流式(SOCK_STREAM):提供可靠的、面向连接的通信流,使用TCP协议保证数据传输的正确性和顺序性。
  2. 数据报(SOCK_DGRAM):定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的并且不保证可靠、无差错,使用数据报协议UDP。
  3. 有序分组(SOCK_SEQPACKET)
  4. 原始socket(SOCK_RAW)

在实际应用中,我们一般使用的windows socket规范是2.0版本的,它比1.0版本(只支持tcp/ip)支持更多的协议。

socket编程是有套路可言的:

server服务器部分:
1. initial socket dll
2. creat socket
3. bind socket with address
4. start listen(in this version, only a client)
5. accept client request
6. accept client data
7. send data to client
8. exit

client客户端部分:
1. initial socket dll
2. creat socket
3. connect server
4. send data to server
5.receive data from server
6. exit

这个是我的server与client的思路。可见两部分初始化socket dll和创建socket都是必须的,server要绑定socket并开始监听,而client要先连接server才能收发数据。

该程序可以收发聊天消息(字符串)也可以收发文件,那么问题来了:我们该如何区分接收到的这条数据是字符串还是文件中的一部分呢?

我采用的方法是给文件数据加一个报头f1996,当然这个是随便取的。怎么判断文件数据是否传输完成呢?加一个报尾1996e。当然,这个报尾其实是可有可无的。据我理解,要做到聊天与收发文件的同步进行,即一边聊着天一边看着文件的进度条缓缓前进,这样一来程序是不需要知道什么时候文件传递结束的。这样想下去,我们可以同时收发n个文件(以实际情况来看最好是5个以内)而完全没有判断文件是否传递结束的必要。此外,我们还应该在字符串的前面加另一个报头(比如c2016?现在的程序还没有这个东西),以此来防止可能出现的意外情况。

给出代码
server:https://github.com/ds1231h/MySServer
client:https://github.com/ds1231h/MySClient

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页