socket编程——一个简单的例子

来源:互联网 发布:js 鼠标移到图片放大 编辑:程序博客网 时间:2024/04/30 12:44

转载自:http://blog.csdn.net/wind19/article/details/6156339

从一个简单的使用TCP例子开始socket编程,其基本步骤如下:

server                                                  client

 

+++++++                                          ++++++++

创建socket                                          创建socket

+++++++                                          ++++++++

      |                                                         |

      |                                                         |

      |                                                         |

+++++++                                          ++++++++

地址赋值(                                           地址赋值(

自己的地址)                                        服务器地址)

+++++++                                          ++++++++

      |                                                         |

      |                                                         |

      |                                                         |

++++++++                                              |

用bind绑定                                                |

socket和地址                                             |

++++++++                                              |

      |                                                         |

      |                                                         |

      |                                                         |

+++++++                                                 |

listen                                                         |

+++++++                                                  |

      |                                                    ++++++++++

      |   <------------------------------          connect 服务器         

      |                                                    ++++++++++

+++++++                                                  |

accept                                                        |

+++++++                                                  |

      |                                                           |

      |                                                    +++++++++

      |                                                     recv 和send

      |                                                     进行数据处理

      |                                                     +++++++++

+++++++++                                                |

用accept得到                                                 |

的socket进行                                                 |

recv 和 send                                                 |

+++++++++                                                |

      |                                                             |

      |                                                             |

      |                                                             |

+++++++++                                        +++++++++

close socket                                         close socket

+++++++++                                        +++++++++

 

根据以上步骤,服务器端的代码为

从一个简单的使用TCP例子开始socket编程,其基本步骤如下:server                                                  client +++++++                                          ++++++++创建socket                                          创建socket+++++++                                          ++++++++      |                                                         |      |                                                         |      |                                                         |+++++++                                          ++++++++地址赋值(                                           地址赋值(自己的地址)                                        服务器地址)+++++++                                          ++++++++      |                                                         |      |                                                         |      |                                                         |++++++++                                              |用bind绑定                                                |socket和地址                                             |++++++++                                              |      |                                                         |      |                                                         |      |                                                         |+++++++                                                 |listen                                                         |+++++++                                                  |      |                                                    ++++++++++      |   <------------------------------          connect 服务器               |                                                    +++++++++++++++++                                                  |accept                                                        |+++++++                                                  |      |                                                           |      |                                                    +++++++++      |                                                     recv 和send      |                                                     进行数据处理      |                                                     ++++++++++++++++++                                                |用accept得到                                                 |的socket进行                                                 |recv 和 send                                                 |+++++++++                                                |      |                                                             |      |                                                             |      |                                                             |+++++++++                                        +++++++++close socket                                         close socket+++++++++                                        +++++++++ 根据以上步骤,服务器端的代码为

客户端代码为:

#include <stdio.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <syslog.h>#include <errno.h>#include <stdlib.h>#define MAX_LISTEN_NUM 5#define SEND_BUF_SIZE 100#define RECV_BUF_SIZE 100#define SERVER_PORT 1010int main(){    int sock_fd = 0;    char recvbuf[RECV_BUF_SIZE] = {0};    char sendbuf[SEND_BUF_SIZE] = {0};    int recvlen = 0;    int retlen = 0;    int sendlen = 0;    int leftlen = 0;    char *ptr = NULL;    struct sockaddr_in ser_addr;    memset(&ser_addr, 0, sizeof(ser_addr));    ser_addr.sin_family = AF_INET;    inet_aton("127.0.0.1", (struct in_addr *)&ser_addr.sin_addr);    ser_addr.sin_port = htons(SERVER_PORT);    sock_fd = socket(AF_INET, SOCK_STREAM, 0);    if(sock_fd < 0)    {        syslog(LOG_ERR, "%s:%d, create socket failed", __FILE__, __LINE__);        exit(1);    }    if(connect(sock_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) < 0)    {        syslog(LOG_ERR, "%s:%d, connect socket failed", __FILE__, __LINE__);        exit(1);    }     //receive data     recvlen = 0;     retlen = 0;     ptr = recvbuf;     leftlen = RECV_BUF_SIZE -1;     //do     {         retlen = recv(sock_fd, ptr, leftlen, 0) ;  if(retlen < 0)  {      if(errno == EINTR)  retlen = 0;elseexit(1);  }  recvlen += retlen;  leftlen -= retlen;  ptr += retlen;     }     //while(recvlen && leftlen);     printf("receive data is : %s", recvbuf);     sprintf(sendbuf, "hello server/n");     //send data     sendlen = strlen(sendbuf) +1;     retlen = 0;     leftlen = sendlen;     ptr = sendbuf;    // while(leftlen)     {         retlen = send(sock_fd, ptr, sendlen, 0);  if(retlen < 0)  {      if(errno == EINTR)  retlen = 0;elseexit(1);  }  leftlen -= retlen;  ptr += retlen;     }     close(sock_fd);    }

现在一个简单的使用tcp的socket通信的例子已经完成了,这里有几个需要说明的问题

1)头文件:

sys/socket.h   包含了socket相关的函数,如socket,send 和recv, 以及struct sockaddr等

netinet/in.h    包含了地址结构,如struct sockaddr_in

errno.h           包含了errno 和 EINTR

syslog.h         包含了syslog相关的信息,其打印结果在/var/log/messages里面

 

2)socket地址

对于IPv4来说,其地址用的是struct sockaddr_in,具体结构如下


struct in_addr {  in_addr_t   s_addr;           /* 32-bit IPv4 address */                                /* network byte ordered */};struct sockaddr_in {  uint8_t         sin_len;      /* length of structure (16) */  sa_family_t     sin_family;   /* AF_INET */  in_port_t       sin_port;     /* 16-bit TCP or UDP port number */                                /* network byte ordered */  struct in_addr  sin_addr;     /* 32-bit IPv4 address */                                /* network byte ordered */  char            sin_zero[8];  /* unused */};

 其中sin_len我们一般不关注,也不填(只有在使用routing socket的时候才用到,被内核用来处理各种协议簇的地址结构)。bind, connect, sendto, 和 sendmsg会把socket地址从程序传递给内核; 而accept, recvfrom, recvmsg, getpeername, 和 getsockname会把地址从内核传递给程序。因为不同协议簇的地址结构是不一样的,所以必须要有一个通用的指针来传递地址,对于ANSI C来说我们一般使用void *,但是socket产生早于ANSI C,所以也就没有使用这个机制,而是使用一个通用的地址结构struct sockaddr来处理的



原创粉丝点击