Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212725
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1782
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-24 16:18
  • 认证徽章:
个人简介

为啥不能追求自己的爱好一辈子呢

文章分类

全部博文(81)

文章存档

2017年(1)

2015年(2)

2014年(18)

2013年(60)

分类: 网络与安全

2013-08-30 18:01:58

序言

  这几天,看看网络编程,以前一直只写过很简单的网络,一直对其具有畏惧心理,这几天就硬下头皮,看看怎么应用,暂时不关心,他底层是怎么实现的。也没研究网络方向的驱动模式。我就看了下windows下面和linux下面的各自调用方式,感觉大体是一致的。

实体:

    1.头文件。
       在windows中需要引入头文件 #include
       在linux里面基本山需要引入头文件  #include, #include #include
  2.链接库 
      
windows下面需要主动的链接ws2_32.lib库文件。    

点击(此处)折叠或打开

  1. #pragma comment(lib,"ws2_32.lib")
       在linux中并不需要,linux默认没有动态调用,相关的函数实现在libc.a里面。属于默认的链接选项。
    3.初始化
      
在windows下面需要初始化,windows下面是通过动态链接的方式条用socket的,所以需要告诉你要调用的链接库的版本,操作系统会帮你加载并初始化该dll。
       函数为  :

点击(此处)折叠或打开

  1. int PASCAL FAR WSAStartup( __in WORD wVersionRequired__out LPWSADATA lpWSAData);
  2. int PASCAL FAR WSACleanup(void);
   4.结构体
     
在windows和linux里面于socket相关的结构体基本一样。我们再次只是说明基本的。结构体sockaddr_in,windows定义为
      

点击(此处)折叠或打开
   

  1. struct sockaddr_in {
            short   sin_family;//表示网络介质,最常见的是AF_INET表示互联网
            u_short sin_port;   //端口,需要的是网络字节序一般通过htons函数取的
            struct  in_addr sin_addr; //本机的IP地址,也需要网络字节序,一般通过inet_addr("IP")取得
            char    sin_zero[8];
    };

  2. //保存网络字节序的ip地址
  3. typedef struct in_addr {
  4.         union {
  5.                 struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
  6.                 struct { USHORT s_w1,s_w2; } S_un_w;
  7.                 ULONG S_addr;
  8.         } S_un;

  9. //有了这个宏定义就可以使得linux和windows的形式是一样的。

  10. #define s_addr S_un.S_addr /* can be used for most tcp & ip code */
       linux里面的定义为:

点击(此处)折叠或打开

  1. struct sockaddr_in {
  2.     sa_family_t sin_family; /* address family: AF_INET */
  3.     in_port_t sin_port; /* port in network byte order */
  4.     struct in_addr sin_addr; /* internet address */
  5. };

  6. /* Internet address. */
  7. struct in_addr {
  8.     uint32_t s_addr; /* address in network byte order */
  9. };
     5.函数
       

       在windows和linux里面关于socket的函数时一致的只是windows里面宏定义了一个socket描述符。如下
       

点击(此处)折叠或打开

  1. int socket(int domain, int type, int protocol);
  2. int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
  3. int listen(int sockfd, int backlog);
  4. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  5. ssize_t recv(int s, void *buf, size_t len, int flags);
  6. ssize_t send(int s, const void *buf, size_t len, int flags);
      其中listen中的参数backlog表示的是,正在或者已经经过了三次握手,但是没有经过应用程序处理的个数(也就是没有经过accept,分配描述符的)。
     所以一个典型的server的代码为:
    

点击(此处)折叠或打开

  1. #ifdef WIN32
  2. #include<WinSock.h>
  3. #include
  4. #pragma comment(lib,"ws2_32.lib")
  5. #else
  6. #include<sys/types.h>
  7. #include<sys/socket.h>
  8. #include<netinet/in.h>
  9. typedef int SOCKET;
  10. #endif
  11. #define PORT 2048
  12. #define BACKLOG 10
  13. int main()
  14. {
  15. #ifdef WIN32
  16.     WSADATA WSAData;
  17.     ::WSAStartup(MAKEWORD(1,1),&WSAData);
  18. #endif
  19.     
  20.     SOCKET sock,sock_client;
  21.     sock = socket(AF_INET,SOCK_STREAM, 0);
  22.     
  23.     struct sockaddr_in serveraddr, client_addr;
  24.     serveraddr.sin_family = AF_INET;
  25.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  26.     serveraddr.sin_port = htons(PORT);//端口和IP得转化成网络字节序,也就是bigendian
  27.     memset(serveraddr.sin_zero, 0 , sizeof(serveraddr.sin_zero));
  28.     bind(sock, (struct sockaddr*)&serveraddr,sizeof(serveraddr));

  29.     listen(sock, BACKLOG);
  30.     int sin_size = sizeof(client_addr);
  31.     
  32.     sock_client = accept(sock, (struct sockaddr*)&client_addr, &sin_size);
  33.     char buf[] = "hello world!";
  34.     send(sock_client,buf, strlen(buf), 0);
  35. #ifdef WIN32
  36.     ::closesocket(sock);
  37.     ::closesocket(sock_client);
  38.     ::WSACleanup();
  39. #else
  40.     close(sock_client);
  41.     close(sock);
  42. #endif
  43. }
边代码忽略了出现错误的情况的错误处理。因为windows和linux的返回值往往不一样。所以这些细节太麻烦就不想写了。

总结:

   实网络编程的基础还是很简单的,复杂的是网络的优化,和所有方向的关于多线程或者多进程的处理。

 
阅读(1131) | 评论(0) | 转发(0) |
2

上一篇:linux man

下一篇:vim IDE 使用vundle

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册