例程:Linux下的socket演示程序2

本程序完成学生信息注册功能(将学生信息存放到服务器)。

服务器端:

#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>#define  MYPORT    6013
#define  SERADDR   "192.168.1.141"//要设置为服务器的IP地址
#define  BLEN      100
#define  STAT_OK    0
#define  STAT_ERR   1
#define  CMD_REGISTER 1
typedef struct FORMAT
{char name[20];int age;int cmd;int stat;
}info;char recvbuf[100];int main(void)
{int sockfd=-1;int ret=-1;int clifd=-1;socklen_t len=0;struct sockaddr_in seraddr={0};//也可以使用memset函数进行初始化struct sockaddr_in clientaddr={0};//第一步:socket函数,获取网络连接的文件描述符sockfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sockfd){perror("socket error:");return -1;}printf("socket success!socket=%d.\n",sockfd);//第二步:bind函数,绑定sockfd与服务器的ip地址、端口号//填充seraddr这个结构体seraddr.sin_family=AF_INET;//定义ip类型,IPV6还是IPV4seraddr.sin_port=htons(MYPORT);seraddr.sin_addr.s_addr=inet_addr(SERADDR);ret=bind(sockfd,(const struct sockaddr*)&seraddr,sizeof(seraddr));//类型不一样,会警告if(ret==-1){perror("bind error:");//函数本身有错误号时可以用perror来显示错误信息}printf("bind success!\n");//第三步:listen函数,监听服务器的当前端口(其他端口不监听)ret=listen(sockfd,BLEN);//第二个参数是服务器允许的队列长度,比如最多100号if(ret==-1){perror("listen error:");}printf("listen success!\n");//第四步:accept函数,阻塞等待用户连接  //注意accept返回值是网络文件描述符,和sockfd不同,它才是真正的用于发送数据的fd,而sockfd只是用于侦听的。clifd=accept(sockfd,(struct sockaddr*)&clientaddr,&len);printf("用户连接成功!\n");/*  while(1){//第五步:recv函数,服务器开始接收数据ret=recv(clifd,recvbuf,sizeof(recvbuf),0);printf("client发送的内容是:%s\n",recvbuf);memset(recvbuf,0,sizeof(recvbuf));//第六步:服务器解释数据包//第七步:回复客户端OKret=send(clifd,"OK",2,0);}
*/while(1){info st;ret=recv(clifd,&st,sizeof(recvbuf),0);if(CMD_REGISTER==st.cmd){printf("用户要注册学生信息\n");printf("姓名:%s,年龄:%d\n",st.name,st.age);st.stat=STAT_OK;ret=send(clifd,&st,sizeof(info),0);}}return 0;
}

客户端:

#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<string.h>#define  SERPORT 6013
#define  SERADDR "192.168.1.141"//要设置为服务器的IP地址
#define  CMD_REGISTER 1#define  STAT_OK   0
#define  STAT_ERR  1typedef struct FORMAT
{char name[20];int age;int cmd;int stat;
}info;char sendbuf[100];
char recvbuf[100];int main(void)
{//第一步:socket函数,获取网络连接的文件描述符int sockfd=-1;int ret=-1;struct sockaddr_in seraddr={0};sockfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sockfd){perror("socket error:");return -1;}printf("socket success.socket=%d.\n",sockfd);//第二步:connect函数,连接服务器seraddr.sin_family=AF_INET;//定义ip类型,IPV4还是IPV6seraddr.sin_port=htons(SERPORT);seraddr.sin_addr.s_addr=inet_addr(SERADDR);ret=connect(sockfd,(const struct sockaddr*)&seraddr,sizeof(seraddr));printf("连接成功\n");/*   while(1){ //第三步:send函数,客户端给服务器发送信息printf("请输入你想发给服务器的内容:\n");scanf("%s",sendbuf);ret=send(sockfd,sendbuf,strlen(sendbuff),0);//第四步:客户端接收服务器端的回复memset(recvbuf,0,sizeof(recvbuf));ret=recv(sockfd,recvbuf,sizeof(recvbuf),0);printf("服务器回复内容是:%s\n",recvbuf);//第五步:客户端解释服务器的回复,再做下一步定夺}
*/  info st1;while(1){ printf("\n请输入学生姓名:\n");scanf("%s",st1.name);printf("\n请输入学生年龄:\n");scanf("%d",&st1.age);st1.cmd=CMD_REGISTER;ret=send(sockfd,&st1,sizeof(info),0);//第四步:客户端接收服务器端的回复memset(&st1,0,sizeof(st1));ret=recv(sockfd,&st1,sizeof(st1),0);if(STAT_OK==st1.stat){printf("注册学生信息成功!");}elseprintf("注册学生信息失败!");}return 0;
}

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

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

相关文章

关于VC++6.0中getline函数的一个bug

关于VC6.0中getline函数的一个bug 最近在调试程序时&#xff0c;发现getline函数在VC6.0和其他编译器上运行结果不一样&#xff0c;比如有如下这段程序&#xff1a; #include <iostream> #include <string>using namespace std;int main(void) {string str;getline…

Nagios添加主机监控失败-故障小结

如果在/usr/local/nagios/etc/object 下自建hosts.cfg和services.cfg文件定义主机和服务后&#xff0c;在web界面只能查看到localhost主机&#xff0c;而看不到所要检测主机&#xff0c;这时候就要查看有没有在/usr/local/nagios/etc/nagios.cfg文件中加入自建文件hosts.cfg和s…

postgresql 数据表【转】

原文&#xff1a;http://www.cnblogs.com/stephen-liu74/archive/2011/12/16/2290803.html 一、表的定义&#xff1a; 对于任何一种关系型数据库而言&#xff0c;表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。 1. 创建表&#xff1a; CREATE…

linux文本文件和win文本文件的格式互换

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 有时在WIN下编辑好的脚本文件上传到LINUX服务器中不能正常执行&#xff0c;开始误认为是LINUX配置问题&#xff0c;后来才发现是WIN与LINUX存储文件时的换行符标志不同造成的。在DOS使用的换行符为 ^M$&…

抽取网络信息进行数据挖掘 建立语料库

最近的实习项目需要做一个大数据库&#xff08;语料库&#xff09;&#xff0c;采集博客、微博、问答库的信息。将数据库的内容进行训练&#xff0c;最后应该是做成一个类似中文siri的模型吧。 第一步新闻抓取器已经稳定运行了&#xff0c;基本原理用的是爬虫去爬新闻门户网站的…

Hive hang without response

前些天Hive查询的接口一直超时报警&#xff0c;登录上去查看发现这个超时报警的曲线很有规律&#xff0c;每个小时开始就出现&#xff0c;过了大约3分钟左右就好了.在这个期间里&#xff0c;也发现hive根本就执行不了&#xff0c;完全hang住了&#xff0c;机器负载&#xff0c;…

四旋翼无人机调研结果

P.S&#xff1a;作者曾在大学某次小班课上看到该视频&#xff0c;深深被震撼了&#xff0c;因此对无人机念念不忘。 恰逢某课程要求讲解自己喜欢的领域的内容&#xff0c;因此对四旋翼无人机进行了调研。

java常用方法

public static int byte2int(byte b) {int i b & 0x07f;if (b < 0) {i | 0x80;}return i; } //运行代码 function runEx(cod1) {coddocument.getElementById(cod1)var codecod.value;if (code!""){var newwinwindow.open(,,); newwin.opener null newwin.…

MySQL 计算两个时间的差值

TIMESTAMPDIFF(type,exp2,exp1) type:year,month,day,HOUR,min,second等 例如&#xff1a;select TIMESTAMPDIFF(SECOND,2012-10-1 2:0:0,2012-10-1 2:0:3) 结果&#xff1a;3.转载于:https://www.cnblogs.com/ja-net/archive/2012/11/05/2754724.html

【原】通过npm script运行webpack的原理

原理&#xff1a;在项目中&#xff0c;局部安装依赖&#xff0c;依赖如果有创建命令的情况下会在node_modules/.bin目录创建软链接&#xff0c;pack.json默认读取到.bin下的命令。 如有理解不对&#xff0c;请各位大神纠正 转载于:https://www.cnblogs.com/luckyXcc/p/11332543…

Android 弹出有确认按键的对话

//弹出对话框--------------------------------------------------private void openDialog(String strMsg, String strTitle){new AlertDialog.Builder(this).setTitle(strTitle).setMessage(strMsg).setPositiveButton("确认",new DialogInterface.OnClickListener…

选购四轴飞行器的部件

内容截于&#xff1a;http://www.loveuav.com/article-191-1.html

神马是线程?PHP对其具体的应用?应用在哪里?

未解决 转载于:https://www.cnblogs.com/qin520/archive/2012/11/06/2757859.html

【原】webpack--loaders,主要解释为什么需要loaders和注意事项

Why需要loaders? webpack开箱即用只支持JS和JSON两种文件类型&#xff0c;但是比如css、less&#xff0c;还有目前市场上比较新的语法糖jsx&#xff0c;怎么处理呢&#xff1f; 通过Loaders去支持其他文件类型并且把它们转化为有效的模块&#xff0c;并且可以添加到依赖图中。…

重复编辑命令行

为什么80%的码农都做不了架构师&#xff1f;>>> 要想重复前面已经输入的命令&#xff0c;请按向上方向键。每按这个键一次&#xff0c;shell都会显示前一个命令行。要想重新执行所显示的命令行&#xff0c;请按回车键。按向下方向键&#xff0c;则可以沿着相反的方…

C语言宏定义函数

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 在软件开发过程中&#xff0c;经常有一些常用的代码段&#xff0c;这些常用的代码段既可以写成函数&#xff0c;也可以封装成宏定义。那么究竟是用函数好&#xff0c;还是宏定义好&#xff1f;这就要求我们…

壊小子的学习【日常阅读篇】(三)常规学习类图书

在上一篇职业相关图书中也提到过目前的职业方向&#xff0c;其中项目经理、产品经理是未来的发展方向&#xff0c;因此这类的书也就成为了常规类的学习用书。另外还包括的是工商管理类图书、心理学类、法律类以及外语类。 工商管理是准备续的本科&#xff0c;虽然是交钱就能拿到…

【原】webpack--plugins,主要解释plugins干了啥

其实呢&#xff0c;plugins是增强webpack的功能&#xff0c; 插件用于bundle文件的优化&#xff0c;资源管理和环境变量的注入&#xff0c; 可以理解为任何loaders不能做的事让它来做&#xff0c; 作用于整个构建过程。 常见的plugins有哪些&#xff1f; CommonsChunkPlugin: 将…

hadoop2.2.0 分布式存储hdfs完全分布式搭建及功能测试记录(一)----架构及原理介绍...

0.文档说明&#xff1a;本文是围绕hadoop2.2的分布式文件系统hdfs进行分布式存储功能测试&#xff0c;形成的hdfs分布式存储功能测试报告&#xff0c;其中主要包括三大部分内容&#xff1a;第一部分介绍了hdfs的基本原理&#xff1b;第二部分介绍了hadoop2.2的完全分布式集群安…

宏定义函数container_of的解释

从kernel里面抠出的一些与宏container_of有关的代码&#xff0c;如下&#xff1a; 1、此宏作用是从结构体的某元素&#xff08;member&#xff09;出发&#xff0c;得到结构体的首地址&#xff1b; 2、container_of的参数解释 &#xff08;1&#xff09;type&#xff1a;指的是…