北飞

非一般的感觉
随笔 - 9, 文章 - 3, 评论 - 0, 引用 - 0
数据加载中……

网络编程学习系列一 套接字和客户端服务器模式

目录:

1.什么是套接字?

2.如何创建套接字?

3.如何创建简单的服务器?

4.如何创建简单的客户端?

一 什么是套接字

 很多教材中会讲解什么是套接字,这里我讲一下我的理解。我们想和另一个大楼的某个房间的美眉建立联系,可选的方案是知道对方的电话直接呼叫,另外就是利用对方的地址(大楼和房间)写信给她,这个就是基本的通信。其实这个过程和利用套接字建立联系是有很大相似的。我们知道IP可以标记一台主机,而端口则是标记具体的服务,套接字是主机对面服务接口的抽象,它屏蔽了内部的具体实现,我们可以利用它与另一个进程(不管是否在一台主机上)建立通信。

二 如何建立套接字

   不管是linux还是windows都提供了一系列的socket函数,而套接字可以socket创建,函数的原型为int socket(int domain,int type,int protocal),domain一般会取AF_INET,这表示采用因特网域,type类型一般会取SOCK_STREAM和SOCK_DGRAM两种类型,分别对应着字节流和数据报两种类型。

三 如何创建简单的服务端

   服务端犹如那个美眉,我们要想联系知道她的地址。一般开放的美眉会向开开放自己的地址,等着帅哥过来主动联系,美眉为了隐藏自己会用自己的小号与帅哥联系,而且可能还要保存着帅哥的信息以便以后可以继续联系。服务端会按照以下的方式进行创建:

(1)    创建套接字 socket

(2)    这个套接字命名,即绑定地址:sockaddr_in   bind

(3)    建立等待客户端连接的队列,设置套接字为监听状态 listen

(4)    接受客户端的连接 accept

(5)    关闭连接 close

备注:accept会返回一个套接字,服务端会利用这个套接字与客户端进行联系。

等走完以上几个步骤后,一个简单的服务端程序就可以运行了啊,我们帅哥(客户端)就可以主动的联系我们的美眉了啊。

四 如何创建简单的客户端

 客户端就是那个要主动联系美眉的角色,没有什么内涵,也不需要添加太多的功能,客户端可以按照一下流程就可以搞定:

(1)    创建套接字 socket

(2)    连接服务端 connect

(3)    关闭连接 close

通过以上流程,客户端就可以搞定了啊,客户端和服务端两者就可以畅快的通信了啊。
服务端代码:

 1  #include <iostream>
 2  #include <sys/socket.h>
 3  #include <sys/types.h>
 4  #include <arpa/inet.h>
 5  using namespace std;
 6 
 7  int main()
 8  {
 9       //create socket handle
10       int listen_sock = socket(AF_INET,SOCK_STREAM,0);
11       if(listen_sock < 0)
12       {
13           cout << "create socket error" << endl;
14           return -1;
15       }

16 
17      //bind socket
18      struct sockaddr_in server_addr;
19      server_addr.sin_family = AF_INET;
20      server_addr.sin_port = htons(5555);
21      server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
22      if(bind(listen_sock,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)
23      {
24          cout << "bind socket error" << endl;
25          close(listen_sock);
26          return -1;
27      }

28  
29      listen(listen_sock,5);
30      //wait for connection
31      while(true)
32      {
33          int sock = accept(listen_sock,NULL,NULL);
34          send(sock,"hello world",strlen("hello world")+1,0);
35          close(sock);
36      }

37  
38      close(listen_sock);
39      return 0;
40  }

41

客户端代码:

 1  #include <iostream>
 2  #include <sys/socket.h>
 3  #include <sys/types.h>
 4  #include <arpa/inet.h>
 5  using namespace std;
 6 
 7  const int BUFSIZE = 128
 8  int main()
 9  {
10     //create socket
11     int client_socket = socket(AF_INET,SOCK_STREAM,0);
12     if(client_socket < 0)
13     {
14        cout << "create socket error" << endl;
15        return -1;
16     }

17 
18     //set address and bind socket
19     struct sockaddr_in server_addr;
20     server_addr.sin_family = AF_INET;
21     server_addr.sin_port = htons(5555);
22     server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
23 
24     if(connect(client_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)
25     {
26        cout << "connect server eror" << endl;
27        close(client_socket);
28        return -1;
29     }

30 
31     char buf[BUFSIZE];
32     if(recv(client_socket,buf,BUFSIZE,0< 0)
33     {
34        close(client_socket);
35        return -1;
36     }

37     else
38     {
39         cout << buf << endl;
40         close(client_socket);
41         return 0;
42     }

43  }

44


 

posted on 2010-08-05 19:29 北飞 阅读(565) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理