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)的更多相关文章

  1. UNIX/Linux网络编程基础:图解TCP/IP协议栈

    目录 1.主机到网络层协议:以太网协议 2.IP协议 3.网际控制报文协议(ICMP) 4.传输控制协议(TCP) 5.用户数据报文协议(UDP) 6.流控制传输协议(SCTP) 7.地址解析协议(A ...

  2. linux网络编程-socket(37)

    在编程的时候需要加上对应pthread开头的头文件,gcc编译的时候需要加了-lpthread选项 第三个参数是线程的入口参数,函数的参数是void*,返回值是void*,第四个参数传递给线程函数的参 ...

  3. 找呀志_java网络编程(4)TCP/IP、Http和Socket差额

    经java网络编程(1)网络体系结构及通信协议我知道IP协议相应于网络层.TCP协议相应于传输层.而HTTP协议相应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决数据怎 ...

  4. Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

    from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO ...

  5. Linux网络编程——连接和面向连接的协议之间没有区别

    网络编程中最重要的概念就是连接取向(connection-oriented)和无连接(connectionless)协议.虽然本质.两者之间的区别是不难理解,编程的人来说,却是个非常easy混淆的问题 ...

  6. -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp

    计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来, 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. 网络编程 ...

  7. UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认

    在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...

  8. Linux网络编程-----Socket地址API

    (1) 通用socket地址 socket网络编程接口中表示socket地址的是结构体sockaddr,其定义如下: #include<bits/socket.h> struct sock ...

  9. Linux入门培训教程 linux网络编程socket介绍

    一.概念介绍 网络程序分为服务端程序和客户端程序.服务端即提供服务的一方,客户端为请求服务的一方.但实际情况是有些程序的客户端.服务器端角色不是这么明显,即互为Linux培训 客户端和服务端. 我们编 ...

  10. Linux网络编程socket错误分析

    socket错误码: EINTR: 阻塞的操作被取消阻塞的调用打断.如设置了发送接收超时,就会遇到这种错误. 只能针对阻塞模式的socket.读,写阻塞的socket时,-1返回,错误号为INTR.另 ...

随机推荐

  1. 69个微信小程序常见问题

    本文转自 遇到小程序方面的问题,该去哪里提问呢? 若是能得到微信官方的解答,想必是最叫人安心的.而微信也确实提供了这么一个地方. 在微信公众平台的开发者社区,就置顶了一个「小程序常见问题 FAQ」帖. ...

  2. 1202: [HNOI2005]狡猾的商人

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1554  Solved: 745[Submit][Stat ...

  3. 利用cropper插件裁剪本地图片,然后将裁剪过后的base64图片上传至七牛云空间

    现在做的项目需要做一些图片处理,由于时间赶急,之前我便没有处理图片,直接将图片放在input[type=file]里面,以文件的形式提交给后台,这样做简直就是最低级的做法,之后各种问题便出来了,人物头 ...

  4. 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度

    所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...

  5. Parallel.For 你可能忽视的一个非常实用的重载方法

    说起Parallel.For大家都不会陌生,很简单,不就是一个提供并行功能的for循环吗? 或许大家平时使用到的差不多就是其中最简单的那个重载方法,而真实情况 下Parallel.For里面有14个重 ...

  6. [原创]HBase学习笔记(4)- 数据导入

    需要分别从Oracle和文本文件往HBase中导入数据,这里介绍几种数据导入方案. 1.使用importTSV导入HBase importTSV支持增量导入.新数据插入,已存在数据则修改. 1.1.首 ...

  7. 设计模式的征途—1.单例(Singleton)模式

    单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...

  8. vue学习笔记 样式 class style(五)

    使用v-bind数据绑定class和style,v-bind:class可以与传统的class属性共存,其中可以用{}设置多个class,根据条件判断的语法是class名:条件,带-的class名需要 ...

  9. C#关于AutoResetEvent的使用介绍(用AutoResetEvent实现同步)

    前几天碰到一个线程的顺序执行的问题,就是一个异步线程往A接口发送一个数据请求.另外一个异步线程往B接口发送一个数据请求,当A和B都执行成功了,再往C接口发送一个请求.说真的,一直做BS项目,对线程了解 ...

  10. 从输入url到页面加载完成发生了什么?——前端角度

    这是一道经典的面试题,这道面试题不光前端面试会问到,后端面试也会被问到.这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解你对哪一方面的知识比较擅长,然后继续追问看看你的掌握程度.当 ...