C简单的TCP Socket Server

近日晚上回家后潜心研究socket,对TCP/IP有了一点点点…了解~ 扫了些以前模糊的概念,发现socket很好玩,还有信号这两天也接触了点,但都是线程不安全的,以后慢慢研究到线程安全部分再和大家分享

同时也了解了几年前的大名鼎鼎的SYN攻击,网络的世界真是神奇阿~ 哇哈哈~

全部代码就不给出了,有点丑陋丢人阿…

  1. #include "lib/unp.h"  //包含了些socket的头文件
  2.  
  3. int main(int argc, char* argv[]) {
  4.     int sockfd, connfd;
  5.     struct sockaddr_in servadd, cliaddr;
  6.     char buf[MAXLINE];
  7.     char buff_client_ip[16];
  8.     socklen_t len;
  9.  
  10.         //创建socket
  11.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  12.         err_sys("socket create failed!");//自己封装了些错误处理函数,实现起来还是蛮简单的
  13.     }
  14.  
  15.     bzero(&servadd, sizeof(servadd));// 对结构体清0,也可以理解为初始化,底层实现通过memset
  16.     servadd.sin_family = AF_INET; // ipv4域
  17.     servadd.sin_port = htons(SERV_PORT); //host=>network <short> 16位字节序(二进制)
  18.     servadd.sin_addr.s_addr = INADDR_ANY; //服务器IP地址,INADDR_ANY为0
  19.  
  20.     /*if( inet_pton(AF_INET,SERVER_IP,&servadd.sin_addr) <= 0 )//inet_pton presentation => numberic 同上用于初始化sockaddr结构体ip
  21.      {
  22.      err_quit("inet_pton error for %s",SERVER_IP);
  23.      }*/
  24.  
  25.         // 绑定
  26.     Bind(sockfd, (SA*) &servadd, sizeof(servadd));
  27.     //监听,有两个队列,未完成链接队列以及完成链接队列
  28.         Listen(sockfd, LISTENQ);
  29.  
  30.     for (;;) {
  31.         len = sizeof(cliaddr);
  32.         connfd = Accept(sockfd,(SA*)&cliaddr,&len); // 得出客户端链接sock地址以及把信息存储到cliaddr,在此之前进行TCP的三握手,client发送SYN头,server发送ACK,client再回一次确认包给服务器,完成三次握手后,从未完成链接队列移动到完成链接队列,socket状态从SYN_RCVD转换到ESTABLISHED状态
  33.  
  34.         snprintf(
  35.                                 buf,
  36.                                 sizeof(buf),
  37.                                 "Welcome %s:%d\n",
  38.                                  Inet_ntop(AF_INET,&cliaddr.sin_addr,buff_client_ip,sizeof(buff_client_ip)),
  39.                                  ntohs(cliaddr.sin_port)
  40.                                  ); //把相应的数据写入 buf 变量
  41.         Writen(connfd, buf, strlen(buf)); // 把buf变量内容输出到client
  42.         close(connfd); //关闭链接,需要完成4次握手,状态转入SLEEP,一直到有数据转入已完成连接队列,状态再次转入ESTABLISHED
  43.     }
  44.     return 0;
  45. }

参考资料:
http://hqlong.com/2009/06/800.html
http://man.chinaunix.net/develop/c&c++/linux_c/default.htm
这里有你想要的

This entry was posted on 星期三, 一月 20th, 2010 at 5:58 下午 and is filed under c/c++. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

One Response to “C简单的TCP Socket Server”

hqlong 一月 20th, 2010 at 10:51 下午

不错哟!!都研究起c/c++来了!!太牛了!!

Leave a Reply