linux创建socket进程,Linux 网络编程详解二(socket创建流程、多进程版)

netstat -na | grep "" --查看TCP/IP协议连接状态

//socket编程提高版--服务器

#include

#include

#include

#include

#include

#include

#include

#include

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

#include

#include

#include

#include

#include

#include

#include

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

#include

#include

#include

#include

#include

#include

#include

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 ;

}

TCP&sol;UDP Linux网络编程详解

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

Linux 网络编程详解九

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

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

//p2p点对点聊天多进程版--服务器(信号的使用) #include #include #include

Linux 网络编程详解五(TCP&sol;IP协议粘包解决方案二)

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

Linux 网络编程详解十二

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

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

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

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

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

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

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

Linux 网络编程详解十一

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

随机推荐

第15章 设备无关位图&lowbar;15&period;1 DIB文件格式

15.1 DIB文件格式(一种文件格式,扩展名为BMP) 15.1.1 OS/2风格的DIB 文件格式 字段 说明 文件头 (BITMAPFILEHEADER) 1.共14个字节 2.缩写建议用bmf ...

RequireJS和AMD规范

目录 概述 define方法:定义模块 require方法:调用模块 AMD模式小结 配置require.js:config方法 插件 优化器r.js 参考链接 概述 RequireJS是一个工具库, ...

codeforce 421D D&period; Bug in Code

题目链接: http://codeforces.com/problemset/problem/421/D D. Bug in Code time limit per test 1 secondmemo ...

【BZOJ】【1003】【ZJOI2006】物流运输trans

最短路/DP 这题数据规模并不大!!这是重点……… 所以直接暴力DP就好了:f[i]表示前 i 天的最小花费,则有$f[i]=min\{f[j]+cost[j+1][i]+k\} (0\leq j \ ...

Spring Security Encryption三种加密方式

Encryption One-way encryption       单项加密,客户端将要传递的值先加密(使用特定的加密方法),将原值和加密好的值传递过去,服务器端将原始数据也进行一次加密(两者加密 ...

查看ORACLE 数据库及表信息

-- 查看ORACLE 数据库中本用户下的所有表 SELECT table_name FROM user_tables; -- 查看ORACLE 数据库中所有用户下的所有表 select user,t ...

IP地址爬取

ip_spider.py= = = #!/usr/bin/python # coding: utf-8 import os import sys import requests import re i ...

python中的赋值和深浅拷贝

python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 . 此时当B对象里面的内容发生更改的时候,A对象也自然而然的 ...

使用Docker搭建简易的 Java Web 环境

![group_5622_0](http://ow20g4tgj.bkt.clouddn.com/2017-09-10-group_5622_0.png) 从[

Python报错:IndentationError&colon; expected an indented block

sum = 0 for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: sum = sum + x print(sum) 代码如上,但是运行报错: 发现是因为少了缩进,改正 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值