win socket 编程学习与理解

socket是不同进程间的一种通信方式。就象打电话是朋友之间的一种通信方式是一样。个人理解:所谓“通信”,就是相互之间发送数据。有人理解socket是不同计算机之间的一种通信方式,这是不确切的。两个进程,不管是运行在同一台计算机上,还是运行在不同计算机上,都可通过socket技术进行通信。
socket套接字的使用需要有网卡的支持,所以socket一般都被用来在不同机器之间通信,而如果在同一台计算机上的两个进程进行通信,通常采用效率更高的共享内存技术来实现。
  如果我现在有一个进程要跟另一台计算机上的某个进程进行socket通信,那在我这个进程中如何指定另一个进程呢?这里还需要说一下另一个概念——端口,如果把操作系统比作一座房子的话,那端口就是房子的窗口,是系统外界同系统内部进行通信的通道。

      在socket实现中,我们不进行另一个进程的指定,而是指定发送消息或接收消息的端口号。比如说现在进程A要给进程B发消息,我们会把消息发送到进程B所运行的计算机的端口N上,而进程B此时正在监视端口N,这样进程B就能收到进程A发送来的数据,同样进程B也把消息发送到该端口上,进程A也能从该端口收到进程B发送来的数据,当然,这需要客户端和服务器端关于端口号进行一个约定,即共同操作同一个端口。如果客户端把消息发送到端口N1上,而服务器端监视的是端口N2,那通信一定不能成功。端口号最大为65535,不能比这个再大了,但在我们自己的程序中尽量不要用小于1024的端口号,小于1024的端口好很多都被系统使用了,比如23被telnet所使用。

下面介绍几种重要的核心函数:

(1)  SOCKET socket(int af, int type, int protocol);

        无论是客户端还是服务器端,下面这个函数是一定要用到的,也是最先用到的。这个函数是要告诉系统,给我准备好一个socket通道,我要和其它进程通信了。函数的返回值很重要,要记下来,它表示系统为我们准备好的这个socket通道,在以后的每个socket相关函数中都会用到,如果这个值等于SOCKET_ERROR,表示函数执行失败了。函数的参数我们分别给:PF_INET、SOCK_STREAM和IPPROTO_TCP。

(2)int bind(SOCKET s, const sockaddr *addr, int namelen);
       这个函数只有服务器端程序使用
,作用是与某个socket通道绑定。可以用返回值判断该函数执行结果怎么样,如果等于SOCKET_ERROR,那就是失败了第一个参数s,就是socket()函数的返回值在结构addr中,我们要给定一个端口号namelen等于结构sockaddr的大小

(3)int   listen(SOCKET s, int backlog);

这个函数只有服务器端程序使用作用是监听该端口。返回值与bind函数意义一样。

(4)int accept(SOCKET s, sockaddr *addr, int *addrlen);
        这个函数只有服务器端程序使用
作用是响应客户端的连接。返回值与bind函数意义一样。

(5)int connect(SOCKET s, const sockaddr *name, int namelen);
        这个函数只有客户端程序使用
,作用是把客户端和某个计算机的某个端口建立连接。返回值与bind函数意义一样。第一个参数s,就是socket()函数的返回值;在结构name中,我们要给定一个端口号和目的机器名;namelen等于结构sockaddr的大小。

(6)

int send(SOCKET s, char *buf, int len, int flags);
int recv(SOCKET s, char *buf, int len, int flags);
这两个函数就是发送数据和接收数据,客户端和服务器端程序都能用,哪个发送哪个接收不用说了吧?呵呵。
从函数的返回值可以检查函数执行是否成功参数中buf是指向发送或接收的数据的指针,len是数据长度。flags我们给个0就可以(其实是我不知道具体含义)。


使用以上几个函数在 linux 系统上就可成功建立一个socket通信连路,但如果在windows系统上,还要用到另一个函数:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
在windows系统上,首先要执行这个函数,所以要把这个函数放在socket()函数的前面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值