linux网络编程(socket)之面向连接(TCP/IP)
1、流程
服务器:
创建socket;
绑定端口;
监听;
监听到有连接请求,接受请求;
建立连接,开始对话。
客户端:
创建socket;
请求建立连接;
连接建立成功,开始对话。
2、实例代码
//服务器客户端简单聊天工具之服务器(tcp/ip)
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<unistd.h>
#include<arpa/inet.h> //连接端口
#define PORT 6666 //最大连接数
#define CONNECTION 10
int main()
{
int sockfd, client_fd,sendnum,recvnum;
char inbuf[100],outbuf[100];
socklen_t addr_size;
pid_t pid;
struct sockaddr_in my_addr, client_addr; //socket创建
sockfd = socket(PF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail! \n");
return 1;
} //服务器的地址
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY; //绑定端口
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) < 0)
{
perror("bind fail! \n");
close(sockfd);
return 1;
} //开始监听
if(listen(sockfd,CONNECTION) < 0)
{
perror("listen fail! \n");
close(sockfd);
return 1;
}
addr_size = sizeof(struct sockaddr_in); //建立连接
if((client_fd = accept(sockfd,(void *)&client_addr,&addr_size)) < 0)
{
perror("accept fail! \n");
close(sockfd);
return 1;
}
printf("receive connection! \n"); //启动子进程
pid = fork();
if(pid < 0)
{
perror("fork fail! \n");
close(client_fd);
close(sockfd);
return 1;
} //子进程发送消息
else if(pid == 0)
{
while(1)
{
fgets(inbuf,sizeof(inbuf),stdin);
sendnum = send(client_fd,(void*)inbuf,sizeof(inbuf),0);
if(sendnum < 0)
{
perror("send fail! \n");
break;
}
}
} //父进程接收消息
else if(pid > 0)
{
while(1)
{
recvnum = recv(client_fd,(void*)outbuf,sizeof(outbuf),0);
if(recvnum < 0)
{
perror("recv fail! \n");
break;
}
if(recvnum == 0)
{
break;
}
printf("%s:%s",inet_ntoa(client_addr.sin_addr),outbuf);
}
}
close(client_fd);
close(sockfd);
return 0;
} //服务器客户端简单聊天工具之客户端(tcp/ip)
#include<stdio.h>
#include<errno.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<arpa/inet.h>
#define PORT 6666 //连接端口
#define IP "127.0.0.1"
int main()
{
int sockfd,sendnum,recvnum;
char inbuf[100],outbuf[100];
pid_t pid;
struct sockaddr_in serv_addr; //socket创建
sockfd = socket(PF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail! \n");
return 1;
} //服务器的地址
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr(IP); //连接服务器
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) < 0)
{
perror("connect fail! \n");
close(sockfd);
return 1;
}
printf("connect sucessful! \n"); //启动子进程
pid = fork();
if(pid < 0)
{
perror("fork fail! \n");
close(sockfd);
return 1;
} //子进程发送消息
else if(pid == 0)
{
while(1)
{
fgets(inbuf,sizeof(inbuf),stdin);
sendnum = send(sockfd,(void*)inbuf,sizeof(inbuf),0);
if(sendnum < 0)
{
perror("send fail! \n");
break;
}
}
} //父进程接收消息
else if(pid > 0)
{
while(1)
{
recvnum = recv(sockfd,(void*)outbuf,sizeof(outbuf),0);
if(recvnum < 0)
{
perror("recv fail! \n");
break;
}
if(recvnum == 0)
{
break;
}
printf("%s:%s",inet_ntoa(serv_addr.sin_addr),outbuf);
}
}
close(sockfd);
return 0;
}
linux网络编程(socket)之面向连接(TCP/IP)的更多相关文章
- UNIX/Linux网络编程基础:图解TCP/IP协议栈
目录 1.主机到网络层协议:以太网协议 2.IP协议 3.网际控制报文协议(ICMP) 4.传输控制协议(TCP) 5.用户数据报文协议(UDP) 6.流控制传输协议(SCTP) 7.地址解析协议(A ...
- linux网络编程-socket(37)
在编程的时候需要加上对应pthread开头的头文件,gcc编译的时候需要加了-lpthread选项 第三个参数是线程的入口参数,函数的参数是void*,返回值是void*,第四个参数传递给线程函数的参 ...
- 找呀志_java网络编程(4)TCP/IP、Http和Socket差额
经java网络编程(1)网络体系结构及通信协议我知道IP协议相应于网络层.TCP协议相应于传输层.而HTTP协议相应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决数据怎 ...
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO ...
- Linux网络编程——连接和面向连接的协议之间没有区别
网络编程中最重要的概念就是连接取向(connection-oriented)和无连接(connectionless)协议.虽然本质.两者之间的区别是不难理解,编程的人来说,却是个非常easy混淆的问题 ...
- -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp
计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来, 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. 网络编程 ...
- UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...
- Linux网络编程-----Socket地址API
(1) 通用socket地址 socket网络编程接口中表示socket地址的是结构体sockaddr,其定义如下: #include<bits/socket.h> struct sock ...
- Linux入门培训教程 linux网络编程socket介绍
一.概念介绍 网络程序分为服务端程序和客户端程序.服务端即提供服务的一方,客户端为请求服务的一方.但实际情况是有些程序的客户端.服务器端角色不是这么明显,即互为Linux培训 客户端和服务端. 我们编 ...
- Linux网络编程socket错误分析
socket错误码: EINTR: 阻塞的操作被取消阻塞的调用打断.如设置了发送接收超时,就会遇到这种错误. 只能针对阻塞模式的socket.读,写阻塞的socket时,-1返回,错误号为INTR.另 ...
随机推荐
- 每天一个Linux命令 5
命令名称:touch 功能描叙:创建空文件 格式:touch 文件名 范例:$touch japan.list(当前路径创建) $touch /root/japan.list(指定路径创建) $t ...
- java关于map用来筛选的用法
我有一个实体 PropTemplateItem{id,名称,父节点,模版id},父节点为root是定义为根节点. 例如数据: 001,颜色,root,123 002,白色,001,123 003,红色 ...
- 基于SSH协议的端口转发
[前言] 最近一直在使用ssh协议的端口转发(隧道)功能,完成对内网空透等.这篇文章将主要讲解3种常用的ssh tunnelling使用方法和基本原理. 在介绍具体内容前,我先奉上端口转发的常用情景: ...
- IE浏览器下使用AJAX登陆接口请求缓存与登陆不了的问题解决
问题: 在IE浏览器下面,登陆的时候老是登陆不上,但是打开控制台的时候再登陆却能登陆上. 分析: 通过抓包,发现,在不打开控制台的时候,少了一个接口的请求,却返回了改接口的返回信息,但是返回信息并不是 ...
- hdoj1072 Nightmare bfs
题意:在一个地图里逃亡,2是起点,3是终点,1是路,0是墙,逃亡者携带一个炸弹,6分钟就会炸,要在6分钟前到达4可以重制时间,问是否能逃亡,若能则输出最小值 我的思路:bfs在5步内是否存在3,存在则 ...
- 计算机程序的思维逻辑 (74) - 并发容器 - ConcurrentHashMap
本节介绍一个常用的并发容器 - ConcurrentHashMap,它是HashMap的并发版本,与HashMap相比,它有如下特点: 并发安全 直接支持一些原子复合操作 支持高并发.读操作完全并行. ...
- php基础语法(20161021)
上午: 数据库总结: 1.创建数据库 create database 数据库名称 删除数据库 drop database 数据库名称 2.创建表 create table 表名 ( 列名 类型(长度) ...
- Android手机USB调试安全闲扯(315晚会免费充电桩事件)
前言 今年的又准时乖巧的观看了315晚会,与大家一同学习了各种发财致富的方式...咳.咳..学习防范违法行骗的各种手段.比较感兴趣的两个,一人脸识别,二公共充电桩安全隐患.第一个今天不扯, ...
- 简单的add函数的N种写法
最近在学习es6,看到for-of这里,就想自己写着练习一下,于是就准备写一个小函数add来求和.函数很简单,如add(1,2,3)这样.于是我开始着手 一开始我是这么写的 function add( ...
- 关于MFC中InvalidateRect()的思考与疑问
先看一段代码: void CFeatureEdit_LinePolyDLG::DrawRectAll(int type){ CClientDC dc(this); //底框画笔 CPen penRec ...