zoukankan      html  css  js  c++  java
  • 网络套接字编程学习笔记一

    创建套接字函数socket:
       1: #include <sys/socket.h> 
       2: int socket (int domain, int type ,int protocol);
       3: // common invoke invoke:
       4: int sockfd = socket(AF_INET, SOCK_STREAM,0);

    //AP_INET IPV4 协议
    //SOCK_STREAM  有序、可靠、双向的面向连接的字节流协议 TCP

    绑定套接字函数bind:

       1: #include <sys/socket.h>
       2: int bind(int sockfd, const char sockaddr *addr,socklen_t len);
     

    成功返回0 ,失败返回 -1;

    处理面向连接的套接字,需要是现在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接,可以用connect建立一个连接;

       1: #include <sys/socket.h>
       2: int connect(int sockfd, const struct sockaddr *addr , socklen_t len);

    成功返回0,若出错返回-1;

    服务器调用listen来宣告可以接受连接;

       1: #include <sys/socket.h>
       2: int listen(int sockfd ,int backlog);

    成功返回0,出错返回-1;

    一旦服务器调用了listen,套接字就能接受连接请求,服务器使用accept获得连接请求并建立连接

       1: #include <sys/socket.h>
       2: int accept(int sockfd, struct sockaddr *restricted addr, socklen_t* restricted len):

    成功返回文件(套接字)描述符,若出错则返回-1;

    数据传输

    建立连接后可以进行数据传输,数据发送函数send

       1: #include <sys/socket.h>
       2: ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);

    成功返回发送字节数,失败返回-1;

    接收数据函数recv

       1: #include <sys/socket.h>
       2: ssize_t recv(int sockfd , void* buf,size_t nbytes, int flags);

    返回值,以字节计数的消息长度,若无可用消息或者对方已经按按序结束,则返回0,若出错返回-1;

    面向连接的服务器端程序例子:

       1: /**
       2: ** server.c
       3: ** copyright Xu Dongdong 2013.5.9  Open Source Software License.
       4: */
       5: #include <string.h>
       6: #include <stdio.h>
       7: #include <stdlib.h>
       8: #include <sys/socket.h>
       9: #include <netinet/in.h>
      10: #include <arpa/inet.h>
      11: #include <netdb.h>
      12:  
      13: int port = 8000;
      14: int main (int argc ,char*argv[])
      15: {
      16:     struct sockaddr_in  servaddr;
      17:     struct sockaddr_in pin;
      18:  
      19:     int sockfd;
      20:     int sockfd_tmp;
      21:     int addr_size;
      22:  
      23:     char buf[16384];
      24:     int i,len;
      25:  
      26:     sockfd = socket(AF_INET, SOCK_STREAM,0);
      27:     if(sockfd == -1)
      28:     {
      29:         perror("call to socket error");
      30:         exit(1);
      31:     }
      32:     memset(&servaddr,0,sizeof(servaddr));
      33:     servaddr.sin_family = AF_INET;
      34:     servaddr.sin_addr.s_addr= INADDR_ANY;
      35:     servaddr.sin_port = htons(port);
      36:  
      37:     if(bind(sockfd,(struct sockaddr *)&servaddr ,sizeof(servaddr)) == -1)
      38:     {
      39:         perror("call to bind error");
      40:         _exit(1);
      41:     }
      42:  
      43:     if(listen(sockfd,20) == -1)
      44:     {
      45:         perror("call to listen error");
      46:         exit(1);
      47:     }
      48:  
      49:     printf("Accepting connections ......\n");
      50:  
      51:     while(1)
      52:     {
      53:         sockfd_tmp = accept(sockfd,(struct sockaddr*)&pin,&addr_size);
      54:         if(sockfd_tmp == -1)
      55:         {
      56:               perror("call to accept error");
      57:               exit(1);
      58:         }
      59:  
      60:         if(recv(sockfd_tmp,buf,16384,0) == -1)
      61:         {
      62:               perror("call to recv error");
      63:               exit(1);
      64:         }
      65:         printf("receive fronm client:%s\n",buf);
      66:  
      67:         len = strlen(buf);
      68:         for(i=0;i<len;i++)
      69:         {
      70:             buf[i]= toupper(buf[i]);
      71:         }
      72:  
      73:         if(send(sockfd_tmp ,buf,len ,0) == -1)
      74:         {
      75:               perror("call to send error");
      76:         exit(1);
      77:         }
      78:         close(sockfd_tmp);
      79:     }
      80: }

    面向连接的客户端进程:

       1: /**
       2: ** client.c
       3: ** copyright Xu Dongdong 2013.5.9  Open Source Software License.
       4: */
       5: /*#include <unistd.h> */
       6: #include <string.h> /*memset */
       7: #include <stdio.h>
       8: #include <stdlib.h> /*exit*/
       9: #include <sys/socket.h>
      10: #include <netinet/in.h>
      11: #include <arpa/inet.h>
      12: #include <netdb.h>
      13:  
      14: char * host_name = "127.0.0.1";
      15: int port = 8000 ;
      16:  
      17: int main (int argc ,char*argv[])
      18: {
      19:     char buf[8192];
      20:     char messge[256];
      21:    
      22:     struct sockaddr_in pin;
      23:  
      24:     int sockfd,listenfd ;
      25:  
      26:     struct hostent *server_host_name;
      27:     char *str ="A default test string ";
      28:  
      29:     if(argc <2)
      30:     {
      31:         printf("Using :  test  \"Any test string\"   \n");
      32:         printf("We will send a default ttest sting   \n");
      33:     }else{
      34:         str = argv[1];
      35:     }
      36:  
      37:     if((server_host_name = gethostbyname(host_name)) ==0)
      38:     {
      39:         perror("Error resolving local host \n");
      40:         exit(1);
      41:     }
      42:  
      43:  
      44:     sockfd = socket(AF_INET, SOCK_STREAM,0);
      45:     if(sockfd == -1)
      46:     {
      47:         perror("call to socket error");
      48:         exit(1);
      49:     }
      50:  
      51:     memset(&pin,'\0',sizeof(pin));
      52:     pin.sin_family = AF_INET;
      53:     pin.sin_addr.s_addr= htonl(INADDR_ANY);
      54:     pin.sin_addr.s_addr = 
      55: (( (struct in_addr *)(server_host_name -> h_addr)) -> s_addr);
      56:     pin.sin_port = htons(port);
      57:  
      58:     if(connect(sockfd,(struct sockaddr *)&pin ,sizeof(pin)) == -1)
      59:     {
      60:         perror("call to connet to socket ");
      61:         exit(1);
      62:     }
      63:  
      64:     printf("Send message  %s to server \n",str);
      65:  
      66:     if(send(sockfd,str,strlen(str), 0) == -1)
      67:     {
      68:               perror("call to send error");
      69:               exit(1);
      70:     }
      71:  
      72:         printf("...send message...wait for response \n");
      73:  
      74:     if(recv(sockfd,buf,8192,0) == -1)
      75:     {
      76:               perror("error in receiving response from server ");
      77:               exit(1);
      78:     }
      79:         printf("Respnse fronm server:%s\n",buf);
      80:  
      81:         close(sockfd);
      82: }

    使用gcc编译程序,并运行即可,先运行服务器程序,后运行客户端程序

  • 相关阅读:
    Redis数据库属于nosql数据库类型的一种,什么是nosql数据库,和传统关系型数据库比较,以及windows版本的Redis安装
    redis测试100万并发请求 redis-benchmark -h localhost -p 6379 -c 100 -n 10000
    yum install gcc-c++
    反射技术实战
    违反完整约束条件***已找到子记录的删除方法
    C# 连接和操作SQL SERVER数据库
    C#设计模式学习笔记
    C# 获取windows特殊路径
    Android中的颜色设置
    十个值得一试的开源深度学习框架
  • 原文地址:https://www.cnblogs.com/xuddong/p/3070914.html
Copyright © 2011-2022 走看看