netstat -na | grep "" --查看TCP/IP协议连接状态
//socket编程提高版--服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> int main(int arg, char *args[])
{
int sockfd = socket(AF_INET, SOCK_STREAM, );
if (sockfd == -)
{
perror("socket() err");
return -;
}
//地址复用
int on = ;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -)
{
perror("setsockopt() err");
return -;
}
//
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons();
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
/*
* INADDR_ANY表示的是IP地址(0,0,0,0)这样的主机字节序变量
* 本来主机字节序变量转化成网络字节序变量,需要使用htonl()函数,
* 但是INADDR_ANY比较特殊,它的所有位都是0,不存在大端字节序或者小端字节序的情况
* 所以不需要使用htonl()函数
* */
//表示绑定任意一个地址(但是不推荐,最好使用本机ip地址)
//addr.sin_addr.s_addr=INADDR_ANY;
if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -)
{
perror("bind() err");
return -;
}
/*
* 一旦调用listen函数,这个套接字sockfd将变成被动套接字,只能接受连接,不能主动发送连接
* */
if (listen(sockfd, SOMAXCONN) == -)
{
perror("bind() err");
return -;
}
struct sockaddr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);
if (conn == -)
{
perror("accept() err");
return -;
}
printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr));
char recvbuf[] = { };
while ()
{
int rc = read(conn, recvbuf, sizeof(recvbuf));
if (rc == )
{
printf("client is closed !\n");
break;
} else if (rc < )
{
printf("read() failed ! error message:%s\n", strerror(errno));
break;
}
printf("recv message:%s\n", recvbuf);
write(conn, recvbuf, rc);
memset(recvbuf, , sizeof(recvbuf));
}
close(conn);
close(sockfd);
return ;
}
//socket编程提高版--客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> int main(int arg, char *args[])
{
int sockfd = socket(AF_INET, SOCK_STREAM, );
if (sockfd == -)
{
perror("socket() err");
return -;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons();
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -)
{
perror("socket() err");
return -;
}
char sendbuf[]={};
char recvbuf[]={};
while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL)
{
//send
write(sockfd,sendbuf,sizeof(sendbuf));
//recv
int rc=read(sockfd,recvbuf,sizeof(recvbuf));
if(rc<)
{
perror("read() error");
break;
}else if(rc==)
{
printf("connect is cloesd !\n");
break;
}
printf("recv message:%s\n",recvbuf);
memset(sendbuf,,sizeof(sendbuf));
memset(recvbuf,,sizeof(recvbuf));
}
return ;
}
//socket编程提高版--多进程版服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> int main(int arg, char *args[])
{
int sockfd = socket(AF_INET, SOCK_STREAM, );
if (sockfd == -)
{
perror("socket() err");
return -;
}
//地址复用
int on = ;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -)
{
perror("setsockopt() err");
return -;
}
//
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons();
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
/*
* INADDR_ANY表示的是IP地址(0,0,0,0)这样的主机字节序变量
* 本来主机字节序变量转化成网络字节序变量,需要使用htonl()函数,
* 但是INADDR_ANY比较特殊,它的所有位都是0,不存在大端字节序或者小端字节序的情况
* 所以不需要使用htonl()函数
* */
//表示绑定任意一个地址(但是不推荐,最好使用本机ip地址)
//addr.sin_addr.s_addr=INADDR_ANY;
if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -)
{
perror("bind() err");
return -;
}
/*
* 一旦调用listen函数,这个套接字sockfd将变成被动套接字,只能接受连接,不能主动发送连接
* */
if (listen(sockfd, SOMAXCONN) == -)
{
perror("bind() err");
return -;
}
//int conn = 0;
while ()
{
struct sockaddr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);
if (conn == -)
{
perror("accept() err");
return -;
}
printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr)); int pid = fork();
if (pid == -)
{
perror("fork() err");
break;
}
if (pid == )
{
char recvbuf[] = { };
while ()
{
int rc = read(conn, recvbuf, sizeof(recvbuf));
if (rc == )
{
printf("client is closed !\n");
break;
} else if (rc < )
{
printf("read() failed ! error message:%s\n",
strerror(errno));
break;
}
printf("recv message:%s\n", recvbuf);
write(conn, recvbuf, rc);
memset(recvbuf, , sizeof(recvbuf));
}
close(conn);
close(sockfd);
exit();
} else
{
close(conn);
}
}
close(sockfd);
return ;
}

Linux 网络编程详解二(socket创建流程、多进程版)的更多相关文章

  1. TCP/UDP Linux网络编程详解

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...

  2. Linux 网络编程详解九

    TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...

  3. Linux 网络编程详解三(p2p点对点聊天)

    //p2p点对点聊天多进程版--服务器(信号的使用) #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  4. Linux 网络编程详解五(TCP/IP协议粘包解决方案二)

    ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...

  5. Linux 网络编程详解十二

    UDP的特点 --无连接 --基于消息的数据传输服务 --不可靠 --UDP更加高效 UDP注意点 --UDP报文可能会丢失,重复 --UDP报文可能会乱序 --UDP缺乏流量控制(UDP缓冲区写满之 ...

  6. Linux 网络编程详解七(并发僵尸进程处理)

    在上一篇程序框架中,解决了子进程退出,父进程继续存在的功能,但是多条客户端连接如果同一时间并行退出,导致服务器端多个子进程同一时间全部退出,而SIGCHLD是不可靠信号,同时来多条信号可能无法处理,导 ...

  7. Linux 网络编程详解四(流协议与粘包)

    TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...

  8. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...

  9. Linux 网络编程详解十一

    /** * read_timeout - 读超时检测函数,不含读操作 * @fd:文件描述符 * @wait_seconds:等待超时秒数,如果为0表示不检测超时 * 成功返回0,失败返回-1,超时返 ...

随机推荐

  1. ThinkPHP的RBAC原理分析

    转载 http://jingyan.baidu.com/article/a948d65151a4810a2ccd2e60.html 方法/步骤 多用户对节点的操作的权限控制,这句话,经过反复扩展功能, ...

  2. php设计模式 观察者模式

    观察者模式的核心是把客户元素(观察者)从一个中心类(主体)中分离开来.当主体知道事件发生时,观察者需要被通知到.同时,我们并不希望将主体与观察者之间的关系进行硬编码.为了达到这个目的,我们可以允许观察 ...

  3. 项目管理之道--纪我的新书《PMP项目管理认证学习指南(第4版)》出版并预祝大卖!

    新年伊始,我最新的项目管理书籍——<PMP项目管理认证学习指南(第4版)>也出版了,真是新年新气象啊!翻译英文书籍是一件任重道远的工作,除了要具备扎实的基本功,熟悉相关的领域外,还需要细致 ...

  4. jQuery Grid With ASP.Net MVC

    jQuery Grid 能够在 ASP.NET MVC 中轻松地实现分页. 排序. 筛选以及 jQuery 插件网格中的 CRUD 操作. 具有以下特征: 时尚的表格数据呈现控件. JavaScrip ...

  5. mysql online ddl

        大家知道,互联网业务是典型的OLTP(online transaction process)应用,这种应用访问数据库的特点是大量的短事务高并发运行.因此任何限制高并发的动作都是不可接受的,甚至 ...

  6. SQL Server:字符串函数

    以下所有例子均Studnet表为例: 1. len():计算字符串长度 len()用来计算字符串的长度,每个中文汉字或英文字母都为一个长度 select sname, len(sname) from ...

  7. web会话管理

    http协议是无状态的协议,也就是说服务器不知道这个http连接是那个浏览器发过来的. 要标识会话的唯一,有两种方法:1 Cookie  2 会话级cookie(开关浏览器算一次会话) 和 持久化的c ...

  8. ASP.NET Web API 简介

    ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RES ...

  9. iOS tabbar 自定义小红点 消息显示,定制边框、颜色、高宽

    一般我们需要显示消息数,会利用到系统提供的api UIApplication.sharedApplication().applicationIconBadgeNumber = 10 但如果我们不想显示 ...

  10. 3-2-1-0-GO

    正式开始第3份工作,入职第2天,午饭后与Team Leader谈了1个多小时,很有收获. 首先,不同的公司有不同的企业文化和规章制度,需要尊重且入乡随俗,尽快学习并适应,争取早日融入公司和团队当中去, ...