linux socket通信组件,Linux下socket简单通信

#define MAXLINE 4096

/**************程序流程*******************

1 用socket()函数创建一个socket

2 用bind()绑定到一个本地的地址,这样其他的socket可以用connect()连接上去

3 用listen()指出愿意接收连接并指定进来的连接的队列限制

4 用accept()函数来接收连接

*****************************************/

int main(int argc, char const *argv[])

{

int listenfd; //监听套接字描述符,管理客户端连接到服务端的个数

int connfd; //连接套接字描述符,被send()和recv()函数所使用

struct sockaddr_in servaddr; //套接字地址结构体

//结构体具体定义见sockaddr_in.jpg

char buff[MAXLINE];

int n;

if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1){

//socket函数向系统申请一个通信端口 原型:int socket(int domain, int type, int protocol);

//domain@ PF_INET, AF_INET: Ipv4网络协议; PF_INET6, AF_INET6: Ipv6网络协议

//type@ SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。SOCK_DGRAM: 使用不连续不可靠的数据包连接。

//protocal@ 传输协议编号,一般设置为0就好。

printf("create socket error: %s(errno:%d)\n",strerror(errno),errno);

//errno 为全局变量,包含在中,程序出错时自动填充。错误号的源代码定义:https://www.cnblogs.com/xrcun/p/3210889.html

//strerror()函数不是线程安全的,strerror_r()是线程安全的。

return 0;

}

memset(&servaddr,0,sizeof(servaddr)); //初始化结构体

servaddr.sin_family = AF_INET; //设置地址家族,此处为IPv4

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

//设置地址:servaddr.sin_addr.s_addr是ip地址,

//htonl()的作用:将主机的unsigned long值转换成网络字节顺序(32位);作用相反的函数即把网络字节顺序转化成主机序列为ntohl()函数;htons()就是转化为short类型的(16位两字节)

//机器上可能有多块网卡,也就有多个IP地址,这时候你要选择绑定在哪个IP上面,如果指定为INADDR_ANY,那么系统将绑定默认的网卡【即IP地址】

//servaddr.sin_addr.s_addr = inet_addr("192.168.81.130")手动设置服务器的IP地址;inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值,inet_ntoa()作用与其相反

servaddr.sin_port = htons(6666); //设置端口

if(bind(listenfd,(struct sockaddr*) &servaddr , sizeof(servaddr)) == -1){

//sockaddr的缺陷是:把目标地址和端口信息混在一起了; sockaddr_in解决了sockaddr的缺陷,但是参数传递时需要类型转换为sockaddr。

printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);

return 0;

}

if(listen(listenfd,10) == -1){

//监听端口后,被动套接字会等待连接,此时系统维护着两个队列,第一个队列存放的是已建立连接的套接字(即完成三次握手后的),第二个队列存放的是未建立连接的套接字(处在三次握手中的)。每次accept函数会将第一个队列中的套接字返回,进行通信,以完成网络传输。

//所以listen的第二个参数意味着这两个队列的总和大小

printf("listen socket error:%s(errno: %d)\n",strerror(errno),errno);

return 0;

}

printf("========== waiting for client's request =============\n");

connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);

while(1){

if( connfd == -1){

//等待客户端连接,连接将加入到等待接受(accept())的队列中

//第一个参数为本地(服务端监听描述符),第二个参数存有客户端IP地址和端口号,第三个参数为sockaddr*指向区域的长度

//accept在有客户端连接上来时会被阻塞

printf("accept socket error: %s(errno: %d)",strerror(errno),errno);

continue;

}

n = recv(connfd,buff,MAXLINE,0);

//buff:缓冲区名字 MAXLINE:缓冲区大小 最后一个参数(flags):

//通常flags设置为0,此时recv()函数读取tcp 缓冲区中的数据到buf中,并从tcp 缓冲区中移除已读取的数据,

//如果把flags设置为MSG_PEEK,仅仅是把tcp 缓冲区中的数据读取到buf中,没有把已读取的数据从tcp 缓冲区中移除,如果再次调用recv()函数仍然可以读到刚才读到的数据。

buff[n] = '\0';

//scanf之类的字符串处理函数会自动将缓冲区的最后一字节设置为 '\0',但是诸如read()等函数就不会自动设置

//TCP缓冲区大小一般分为三级,详见 https://blog.csdn.net/nawenqiang/article/details/81503870

printf("recv msg from client: %s\n",buff);

memset(buff,0,sizeof(buff)/sizeof(char) ); //发送完一次后清空缓冲区,为下一次发送做好准备。

}

close(connfd);

close(listenfd);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android游戏开发系统控件-Dialog

Android游戏开发系统控件-Dialog Dialog(对话框)在Android应用开发中经常用到,下面是学习《Android游戏编程从零开始》一书,关于Dialog的初步学习。 创建项目:DialogProject 作者:wwj 日期:2012/5/13 功能&#xff1a…

2013年c语言课后作业答案,2013年计算机二级C语言课后模拟题三及答案

2013年计算机二级、一级、三级等更多考试考前培训请进入教育联展网-中国教育培训第一门户,助您顺利通过计算机等级考试!一 单项选择题1.printf函数中用到格式符%5s,其中数字5表示输出的字符串占用5列,如果字符串长度大…

线性表的顺序存储 c语言表达,线性表的基本操作顺序存储(C语言).doc

线性表的基本操作顺序存储(C语言)#include#include#include#define LIST_INIT_SIZE/*线性表存储空间初始分配量*/#define LISTINCREMENT/*线性表存储空间分配增量*/#define ok? 1#define OVERFLOW? -1#define false? 0typedef struct {?ElemType *elem;/*存储空间*/?int l…

TiledMap出错

今天加载一个Tiled Map出错! 错误提示: TMX: Only 1 tilset per layer is supported错误原因分析:Tilesets里面有多张图片!而TMX支持一张图片! 解决办法: 将多图片合并成一张图!托进Tilesets里面…

步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,基于SCM和PLC的两种步进电机控制方法...

引 言步进电机位移与输入脉冲信号数相对应,精度高、响应特性好、可靠性高、速度可在较宽范围内平滑调节,是控制系统中一种重要的自动化执行元件。SCM(Single Chip Microcomputer,单片机)是把组成微型计算机的中央处理器、存储器、输入输出接口…

在网上找到一个CSS hack列表,记录在这里以分析css的浏览器兼容性

另外摘抄一份目前的css浏览器兼容问题汇总,记录在这里自己好好学习一下 CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2.0的过度,请尽量用xhtml格式写代码,…

c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码

c语言编写贪吃蛇源代码,简单易懂,文件为VC源代码。如果你正在学习c语言,就来下载吧。很经典的C语言贪吃蛇代码部分#include #include #include#include#define SX 50#define SY 25#define Length 10#define Xnub 50#define Ynub …

android中常见的回调模式

最近做ListView网络图片的异步加载,以及下载网路MP3动态进度显示。看过一些源码都涉及这样的回调,这样节省了很多不必要的重复操作,非常简便。写了一个Demo,够简单的吧. Demo1.java 1 package com.demo; 2 import com.demo.Demo2.TestInterface; 3 public class Demo1 { …

android多个闹钟实现,Android编程实现PendingIntent控制多个闹钟的方法

本文实例讲述了Android编程实现PendingIntent控制多个闹钟的方法。分享给大家供大家参考,具体如下:要用 android.app.PendingIntent.getBroadcast(Context context, int requestCode, Intent intent)来实现控制多个闹钟,关键点在于其中的一个…

C#操作XML之——读取XML文件

名称空间:System.Xml 1.使用XmlDocument读取XML[例]//创建xml文档XmlDocument xdoc new XmlDocument();//读取XML文档xdoc.Load("..\books.xml");//输出XML文档Page.Response.Write(HttpUtility.HtmlEncode(xdoc.InnerXml)); 2.使用XmlReader读取XMLXmlR…

毕业设计Android管理系统,基于android的毕业设计管理系统的设计与实现

摘要:职业学校学生的毕业设计(论文)是在顶岗实习期间进行的,使得毕业设计(论文)际上是处于师生时空分离的状态,很难达到满意的效果。因此,充分利用现代的网络技术及智能手机,建立一个信息化、科学化的毕业设计管理系统。实现毕业设计的网上管理,为指导教师和学生提供…

C++学习笔记1:virtual 继承

今天要学习的内容,有时间写个总结http://hi.baidu.com/cindyylxx/item/fdc4e35c8d98aa10da1635a3 转载于:https://www.cnblogs.com/likwo/archive/2012/05/22/2513301.html

android webview 图表,Android WebView 无法正常显示网页图表

1、Android项目中,使用了一个WebView,加载的页面是一个使用百度echart和canvas写的统计图表,现在网页版和IOS版都能正常显示,Android无法正常显示:2、ios和web端:3、android 端:4、Android控制台…

char *a=0

char *a0是指给a所指的位置赋值\0 与char *a\0是一个意思 下面的例子可以说明: char str[] "abcdefg";char *ptr NULL;prt str 2; //指向c*prt 0; //str 为 ab,因为现在str[]ab\0defg\0*prt c; //str 为 abcdefg 转载于:https://www.cnblogs.com/york-hust/arc…

android怎么根据标题解析json,如何在android中解析没有json对象标题的json数组?

首先,我创建了解析器类JSONParser.javapackage com.example.myparse;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import org.apache.ht…

在Windows XP下,安装VS 2010 Express For Windows Phone .

在安装Windows Phone SDK 的系统环境要求中,只支持windows vista、windows 7,不支持winXP,暂时不想升级win7的用户,想要在XP系统开发WP应用程序,就多了一种限制,多次在网上搜索,会发现在XP下也能…

android如何引用布局,android 动态布局与引用第三方layout中的布局

引用第三方layout中的布局LinearLayout rightContentView (LinearLayout) findViewById(R.id.lyt_chat_content);View child LayoutInflater.from(this).inflate(R.layout.qa_text,null);// 由Layout的Id获得对应的ViewrightContentView .removeAllViews(); // 清除View里面…

荣耀v40pro可以用鸿蒙系统,荣耀V40Pro快来了!麒麟9000+120Hz+鸿蒙系统,价格感人...

原标题:荣耀V40Pro快来了!麒麟9000120Hz鸿蒙系统,价格感人苹果将于10月14日凌晨1点召开秋季第二场新品发布会,iPhone12系列将正式登场。华为Mate40系列的发布日期将会在国庆假期过后公布,不出意外就是10月15日&#xf…

正则表达式 笔记

寻找教程的朋友请移步这里正则表达式30分钟入门教程。 特点: 学习曲线陡峭。不同的正则表达式可以完成功能,但效率却差很多(NFA引擎)。要在复杂性和完整性之间求得平衡,一个重要的因素是了解待搜索的文本。引擎&#x…

鸿蒙思维和小央美,中心路汝南路站附近艺术培训

最佳答案:中心路汝南路站附近有鸿蒙教育思维绘画,童心童画美术馆,小画虫少儿美术培训中心,小央美儿童美术,红点美术培训中心,风之舞打击乐培训中心,红英艺术中心,墨涛书法教育,纸飞机少儿美术,精舞门街舞,原音吉他社,丽玲艺术培训,叮当少儿美术空间,弈趣围棋培训中心…