C简单的TCP Socket Server
近日晚上回家后潜心研究socket,对TCP/IP有了一点点点…了解~ 扫了些以前模糊的概念,发现socket很好玩,还有信号这两天也接触了点,但都是线程不安全的,以后慢慢研究到线程安全部分再和大家分享
同时也了解了几年前的大名鼎鼎的SYN攻击,网络的世界真是神奇阿~ 哇哈哈~
全部代码就不给出了,有点丑陋丢人阿…
- #include "lib/unp.h" //包含了些socket的头文件
- int main(int argc, char* argv[]) {
- int sockfd, connfd;
- struct sockaddr_in servadd, cliaddr;
- char buf[MAXLINE];
- char buff_client_ip[16];
- socklen_t len;
- //创建socket
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- err_sys("socket create failed!");//自己封装了些错误处理函数,实现起来还是蛮简单的
- }
- bzero(&servadd, sizeof(servadd));// 对结构体清0,也可以理解为初始化,底层实现通过memset
- servadd.sin_family = AF_INET; // ipv4域
- servadd.sin_port = htons(SERV_PORT); //host=>network <short> 16位字节序(二进制)
- servadd.sin_addr.s_addr = INADDR_ANY; //服务器IP地址,INADDR_ANY为0
- /*if( inet_pton(AF_INET,SERVER_IP,&servadd.sin_addr) <= 0 )//inet_pton presentation => numberic 同上用于初始化sockaddr结构体ip
- {
- err_quit("inet_pton error for %s",SERVER_IP);
- }*/
- // 绑定
- Bind(sockfd, (SA*) &servadd, sizeof(servadd));
- //监听,有两个队列,未完成链接队列以及完成链接队列
- Listen(sockfd, LISTENQ);
- for (;;) {
- len = sizeof(cliaddr);
- connfd = Accept(sockfd,(SA*)&cliaddr,&len); // 得出客户端链接sock地址以及把信息存储到cliaddr,在此之前进行TCP的三握手,client发送SYN头,server发送ACK,client再回一次确认包给服务器,完成三次握手后,从未完成链接队列移动到完成链接队列,socket状态从SYN_RCVD转换到ESTABLISHED状态
- snprintf(
- buf,
- sizeof(buf),
- "Welcome %s:%d\n",
- Inet_ntop(AF_INET,&cliaddr.sin_addr,buff_client_ip,sizeof(buff_client_ip)),
- ntohs(cliaddr.sin_port)
- ); //把相应的数据写入 buf 变量
- Writen(connfd, buf, strlen(buf)); // 把buf变量内容输出到client
- close(connfd); //关闭链接,需要完成4次握手,状态转入SLEEP,一直到有数据转入已完成连接队列,状态再次转入ESTABLISHED
- }
- return 0;
- }
参考资料:
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.