网络编程入门-socket

socket是支持多种协议的网络编程接口,主要由winsock.h头文件和动态链接库winsock.cll组成(书上这么说)。
下面介绍下建立socket连接的过程和所需要的函数:
服务器端:
首先要启动winsock,用WSAStartup(wVersionRequested,&WSADATA);//这里的参数分别为winsock版本信息和wsadata结构体。
其次创建套接字,寒暑socket(xxx,xxx,0)返回一个套接字。
然后可选择接收何种类型的网络时间通知(以windows消息为基础、以事件为基础)WSAAsyncSelect(m_hSocket,this->m_hWnd,WM_SERVERMSG,xx);
随后绑定socket对象bind(m_hSocket,&m_addr,sizeof(m_addr));其中m_addr为套接字地址结构,就是ip地址以及端口号之类的信息。
再通过listen(m_hSocket,3)设置套接字为监听状态 就算完成了服务器端的初始化工作。

客户端
同样也要先启动winsock,WSAStartup()。
建立套接字socket()。
选择事件模式WSAAsyncSelect(),初始化完成。

这样就可以进行客户端和服务器端的通信了。
当然需要知道服务器端的ip地址以及进程的端口号,连接服务器connect(m_hSocket,m_addr,sizeof(m_addr)),注意:这里的socket是刚才在客户端建立的。
服务器端对客户端的请求作相应的处理
OnServerMsg()//消息处理函数
case:FD_ACCEPT:
    socket = accept(m_hSocket,0,0)//返回一个对应该客户端的socket,服务器端原先的socket仍处在监听状态。
完成连接后,服务器端向客户端发送连接成功的消息
OnClientMsg()
{
case FD_CONNECT: MessageBox("连接成功");   
}
然后就可以通过send()和recv()互相传送接收数据了。
断开连接记得先WSACleanup()终止对Winsock库的使用并释放资源,然后closesocket()关闭套接字。

下面是引用别处的一个socket连接过程的通俗例子:
通俗解释socket
    socket是网络编程的基础,本文用打电话来类比socket通信中建立TCP连接的过程。
    socket函数,表示你买了或者借了一部手机。
    bind函数,告诉别人你的手机号码,让他们给你打电话。
    listen函数,打开手机的铃声,而不是静音,这样有电话时可以立马反应。listen函数的第二个参数,最大连接数,表示最多有几个人可以同时拨打你的号码。不过我们的手机,最多只能有一个人打进来,要不然就提示占线。
    connect函数,你的朋友知道了你的号码,通过这个号码来联系你。在他等待你回应的时候,不能做其他事情,所以connect函数是阻塞的。
    accept函数,你听到了电话铃声,接电话,accept it!然后“喂”一声,你的朋友听到你的回应,知道电话已经打进去了。至此,一个TCP连接建立了。
    read/write函数,连接建立后,TCP的两端可以互相收发消息,这时候的连接是全双工的。对应打电话中的电话煲。
    close函数,通话完毕,一方说“我挂了”,另一方回应"你挂吧",然后将连接终止。实际的close(sockfd)有些不同,它不止是终止连接,还把手机也归还,不在占有这部手机,就当是公用电话吧。
    注意到,上述连接是阻塞的,你一次只能响应一个用户的连接请求,但在实际网络编程中,一个服务器服务于多个客户,上述方案也就行不通了,怎么办?想一想 1860,移动的声讯服务台,也是只有一个号码,它怎么能同时服务那么多人呢?可以这样理解,在你打电话到1860时,总服务台会让一个接线员来为你服 务,而它自己却继续监听有没有新的电话接入。在网络编程中,这个过程类似于fork一个子进程,建立实际的通信连接,而主进程继续监听。1860的接线员 是有限的,所以当连接的人数达到上线时,它会放首歌给你听,忙等待,直到有新的空闲接线员为止。
    实际网络编程中,处理并发的方式还有select/poll/epoll等。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个L/V(Length/Value)模型的异步Socket框架.L是指发送byte数组的长度,L固定为10个byte,V是指要发送的byte数组.可以用于处理超长的消息,处理完成的响应也按照L/V模型发送,客户端接收可以参考服务端解析过程。eg:1.第一次收到的byte[]:0 0 0 0 0 0 1 1 1 2 28 30 18 26 88 99 77 那么先取0 0 0 0 0 0 1 1 1 2,得到长度为1112,对后面的byte(从index10以后)进行存储 2.第二次收到的byte[]:5 10 0 66 0 0 1 1 1 2 28 30 18 26 88 99 44 那么继续存储收到的byte[],在之前的存储上追加 ... ... n.直到第n次收到byte[],在之前的存储上追加,当存储的byte[]长度等于1112时停止接收,开始解析,解析完成按照L/V模型组织发送,发送完毕继续步骤1.(中间遇到过程错误,将关闭会话)特别提醒:1.仅支持UTF8编码解析,原因是UTF8支持任何语言.采用Node.js做测试时,只用了英文字符做发送,原因是UTF8编码英文字符的长度和字符串长度一致(1:1). 2.Command必须实现CommandBase类,并且有一个无参构造函数(当然你可以修改代码,移除此限制,多数情况下这也完全够用),实现的Command类必须名称以Command结尾(大小写敏感).eg:TCommand,客户端发送命令参考Node.js实现,Command为T,则正确匹配TCommand处理返回结果. 3.配置文件参考server.cfg,生成时需拷贝到生成目录(vs可以通过属性设置实现). 4.有很多实现可以提取出接口,进一步优化使得更加容易扩展,更加灵活. 5.如果发现任何问题和不足之处或者BUG请email给我:kingge163@163.com 标签:HSocket
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值