socket编程

说起socket编程,其实真是一件有趣的事呢。刚入门的时候什么都不懂,对于socket编程竟然故意不想学。记得我刚开始学编程的时候就想编写一个厉害的病毒,在全世界传播。当然我知道这是违法的,但这在曾经是促使我在编程这条路上越走越远的一个原因。其实说到底,以前自己写着完写出来的东西,我现在想想都觉得好笑。呵呵话题又扯远了。记得我第一次结束socket套接字的时候是用的vb里面的那个winsock控件,现在很久不用vb了很多东西都要忘记了。我试着用这个vb的socket控件写了一个服务端和客户端聊天的程序,在本机是测试成功了,但发给别人不能用。所以很长的一段时间都对这个socket编程有点怕怕。这种情况一直持续着直到我接触了c语言中的socket编程才得到了改变。我发现socket编程真的是蛮有意思的一件事。

好了进入正题。

我没有专门上过过这种编程的课,所以我说的东西可能都是通过网上的资料凭借着自己的理解学起来的。所以我觉得难免会有差错。如果有的话,希望大家指出来,这对我对以后看到这篇文章的人都会有帮助的。

socket编程我把它分成两部分,服务器端编程和客户端编程。当然这两者是有联系的,很多地方也很相似。这里我先简单介绍一下。所谓服务器端的编程,简单的说就是在在服务器端开一个端口,然后在那个端口上等待别人来连接。而那个去连接服务器端的就是客户端。比如说有一台web服务器在网络中运行,他就会打开80号端口等待我们的浏览器的连接。这时web服务器就是服务端,我们的浏览器就是客户端。

我对linux不是特别了解,所以我以windows下面的socket进行举例。

服务端编程的基本步骤:

1.socket()创建一个套接字,用来监听

2.bind()把电脑上的一个端口和第一步创建的套接字绑定起来。

3.listen()让套接字在第二步绑定的端口上进行监听,但要注意哦,listen这个过程c语言里面可不是阻塞的哦,也就是说调用完毕这个函数之后立刻就返回了。这个函数的作用只是让socket处于监听状态,并没有接受连接的作用。

4.accept()接受连接到端口的连接。这个函数是阻塞的啦,调用了这个函数之后,要是久久没有人来连接,那他下面的语句就执行不了咯。所以一般的做法是新建一个线程,让这个线程去接受所有的连接并进行处理。远程客户端可以用connect来进行连接

5.send()/recv().这两个函数没什么好说的,通过accept()建立了连接之后当然要进行数据传输了。send()的作用就是发送数据.recv的作用就是接收数据。

6.socketclose()关闭套接字。该做的事都做完了,当然要关闭了。有始有终嘛。

而客户端的编程稍微有点不一样,只需要在上述6个步骤中改掉两步,2和3改成connect即可。connect的作用就是连接到一个指定的服务端地址端口。如果服务器端accept了这个请求,那么这个连接暂时就建立了。

只要严格按照这六个步骤来做的话socket编程其实也不过如此。要注意的如果是windows上面的socket编程的话,要在所有步骤之前加

        WSADATA ws;

   WSAStartup(MAKEWORD(2,2),&ws);

这么两句话,这两句话的作用就叫做初始化windows socket dll

不伦服务端或者客户端的socket编程都要加这两句。用VC编译的时候要加上这两句话

#include <winsock.h>

#pragma comment(lib,"ws2_32.lib")

winsock需要ws2_32.lib这个库。

 



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 10312