网络套接字编程学习笔记一

创建套接字函数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编译程序,并运行即可,先运行服务器程序,后运行客户端程序

posted @ 2013-05-10 12:30  远东悟语  阅读(588)  评论(0编辑  收藏  举报

我是徐冬冬