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.另 ...
随机推荐
- wemall app商城源码中android按钮的三种响应事件
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码中android按 ...
- AVFoundation自定义拍照
0.AVCapture <AVFoundation/AVFoundation.h> 媒体采集需要的几个对象: 1.AVCaptureDevice: 代表抽象的硬件设备(如前置摄像头,后置 ...
- UI 基本控件使用
一>UITextFiled ———>UITextField是什么 UITextField ( 输入框 ) : 是控制文本输入和显示的控件.在APP中UITextField 出现频率很高 ...
- (2)写给Web初学者的教案-----让我们开始准备学习
课前准备 我们将会从零基础带领大家一步一步的学习Web前端技术,这个零基础是什么概念呢?你只要具备以下技能就可以学习: 一.个人学习条件(必备) 会开关电脑,手机.(哇塞,任老师你逗我们吧!). 会打 ...
- JavaScript的基本规范
1.不要在同一行声明多个变量: 2.请使用===/!==来比较true/false或者数值: 3.使用对象字面量替代new Array这种形式: 4.Switch语句必须带有default分支: 5. ...
- const与readonly
readonly 关键字与 const: const 字段只能在该字段的声明中初始化.readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数,readonly 字段可能具有不 ...
- 推荐三款日期选择插件(My97DatePicker+jquery.datepicker+Mobiscroll)
1.My97DatePicker 纯原生JS,专注于PC端,支持IE6+:页面上只需要引入WdatePicker.js文件,但是My97DatePicker整个目录是一个整体,最好不要破坏里面的目录结 ...
- 用js写倒计时,向列表添加数据-------2017-03-21
一.单选按钮确定提交是否可用 <input id="a" type="radio" name="a" onclick="c ...
- Eclipse中将含有图片资源的项目打包成jar文件
前言: 最近学了GUI编程和UDP协议,心血来潮想做一个局域网内的聊天软件,前期都还算顺利,直到后来将整个项目打包成jar文件时遇到了困难.如图: 自己设置的图标不见了,但是也没有默认的图标,说明图片 ...
- C# 调用CMD执行命令行
这几天用c#做了一个项目,其中一个功能是要把生成的临时文件隐藏,同时,不能在屏幕上有调用CMD的痕迹,这里生成的临时文件的绝对路径为delfile为文件的绝对路径, 代码如下: private voi ...