ubuntu系统安装socket服务器,Ubuntu上进行socket编程,并且实现通信功能

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define PERM S_IRUSR|S_IWUSR

#define MYPORT 5500 //宏定义,定义通信端口

#define BACKLOG 10

//宏定义,定义服务程序可以连接的最大客户数量

#define WELCOME  "|---------Welcome to the

chat room!----------|"

//宏定义,当客户端连接到服务器时,向客户发送此欢迎字符

//转换函数,将int类型转换成char*类型

void itoa(int i,char*string)

{

int power,j;

j=i;

for(power=1;j>=10;j/=10)

power*=10;

for(;power>0;power/=10)

{

*string++='0'+i/power;

i%=power;

}

*string='\0';

}

//得到当前系统的时间

void get_cur_time(char *time_str)

{

time_t timep;

struct tm *p_curtime;

char *time_tmp;

time_tmp = (char*)malloc(2);

memset(time_tmp,0,2);

memset(time_str,0,20);

time(&timep);

p_curtime = localtime(&timep);

strcat(time_str,"(");

itoa(p_curtime->tm_hour,time_tmp);

strcat(time_str,time_tmp);

strcat(time_str,":");

itoa(p_curtime->tm_min,time_tmp);

strcat(time_str,time_tmp);

strcat(time_str,":");

itoa(p_curtime->tm_sec,time_tmp);

strcat(time_str,time_tmp);

strcat(time_str,")");

free(time_tmp);

}

//创建共享存储区

key_t shm_create()

{

key_t shmid;

if((shmid = shmget(IPC_PRIVATE,1024,PERM)) == -1)

{

fprintf(stderr,"Create Share Memory

Error:%s\n\a",strerror(errno));

exit(1);

}

return shmid;

}

//端口绑定函数,创建套件字,并绑定到指定端口

int bindPort(unsigned short int port)

{

int sockfd;

struct sockaddr_in my_addr;

sockfd = socket(AF_INET,SOCK_STREAM,0);//创建基于六套接字

my_addr.sin_family = AF_INET; //IPv4协议族

my_addr.sin_port = htons(port);//端口转换

my_addr.sin_addr.s_addr = INADDR_ANY;

bzero(&(my_addr.sin_zero),0);

if(bind(sockfd,(struct

sockaddr*)&my_addr,sizeof(struct sockaddr)) ==

-1)

{

perror("bind");

exit(1);

}

printf("bind success!\n");

return sockfd;

}

void write_in_file(char* buf_in)

{

FILE *fp;

if((fp = fopen("/home/wbb/workspace/1.txt","a+")) ==

NULL)

{

printf("文件不能打开!\n");

exit(1);

}

fprintf(fp,"%s\n",buf_in);

fclose(fp);

}

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

{

socklen_t sockfd,clientfd,recvbytes;//定义监听套接字、客户套接字

socklen_t sin_size;

pid_t pid,ppid; //定义父子线程标记变量 pid_t == Process ID_Type

宏定义insigned int 类型

char *buf,*r_addr,*w_addr,*temp,*time_str; //定义临时存储区

struct sockaddr_in their_addr; //定义地址结构

key_t shmid;

shmid = shm_create(); //创建共享存储区

temp = (char*)malloc(255);

time_str = (char*)malloc(20);

sockfd = bindPort(MYPORT); //绑定端口

while(1)

{

if(listen(sockfd,BACKLOG) == -1) //指定端口上监听

{

perror("listen");

exit(1);

}

printf("listening......\n");

if((clientfd = accept(sockfd,(struct

sockaddr*)&their_addr,&sin_size))

== -1)

{

perror("accept");

exit(1);

}

printf("accept from:

%s\n",inet_ntoa(their_addr.sin_addr));

send(clientfd,WELCOME,strlen(WELCOME),0);//发送问候消息

buf = (char*)malloc(255);

ppid = fork();//创建子进程

if(ppid == 0)

{

pid = fork(); //创建子进程

while(1)

{

if(pid >0)

{

//父进程用于接收信息

memset(buf,0,255);

if((recvbytes =

recv(clientfd,buf,255,0))<=0)

{

perror("recv1");

close(clientfd);

raise(SIGKILL);

exit(1);

}

//write buf's data to share memory

w_addr = shmat(shmid,0,0);

memset(w_addr,'\0',1024);

strncpy(w_addr,buf,1024);

get_cur_time(time_str);

strcat(buf,time_str);

printf("接收的:%s\n",buf);

write_in_file(buf);

}

else if(pid == 0)

{

//子进程用于发送信息

//scanf("%s",buf);

sleep(1);

r_addr = shmat(shmid,0,0);

if(strcmp(temp,r_addr)!=0)

{

strcpy(temp,r_addr);

get_cur_time(time_str);

strcat(r_addr,time_str);

if(send(clientfd,r_addr,strlen(r_addr),0) == -1)

{

perror("send");

}

memset(r_addr,'\0',1024);

strcpy(r_addr,temp);

}

}

else

perror("fork");

}

}

}

printf("------------------------\n");

free(buf);

close(sockfd);

close(clientfd);

return 0;

}

客户端代码:

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

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

相关文章

使用JUnit对ADF应用程序进行单元测试

JUnit是Java语言的单元测试软件包&#xff0c;由于ADF构建在J2EE框架之上&#xff0c;因此可以用来测试Oracle ADF应用程序。 单元测试基本上是根据某些定义的测试标准来验证最小的可测试模块的过程。 在这里&#xff0c;我将说明如何在JDeveloper 12.2.1.3中设置和使用JUnit来…

libgo高性能网络服务器,【开源】gnet: 一个轻量级且高性能的 Golang 网络库

![](https://ask.qcloudimg.com/http-save/1303222/sipe2g9n9h.png)# Github 主页[https://github.com/panjf2000/gnet](https://github.com/panjf2000/gnet)欢迎大家围观~~&#xff0c;目前还在持续更新&#xff0c;感兴趣的话可以 star 一下暗中观察哦。# 原文博客[gnet: 一个…

拆分js文件_2021入门Webpack,看这篇就够了:Webpack.config.js 解析

这是优妈成长记的第63篇原创这是一个webpack配置说明本文是发布在github上webpack-demo的README文件内容。主要对webpack.config.js每一条的注释说明。github项目地址&#xff1a;https://github.com/hourong88/webpack-demo可以点击文章最下方【阅读原文】跳转github链接查看&…

orcad自上而下_开发自上而下的Web服务项目

orcad自上而下这是从Alessio Soldano编辑的Advanced JAX-WS Web Services手册中摘录的示例章节。 第一章介绍了自底向上创建Web服务端点的方法。 它允许非常快地将现有bean作为Web Service端点公开&#xff1a;在大多数情况下&#xff0c;将类转换为端点只需在代码中添加少量注…

安装win7系统不能开机启动服务器,win7系统开机启动项不能加载的原因分析及解决...

开机启动项是每台电脑都有的东西&#xff0c;就是多和少的问题的&#xff0c;很多人开机的时候喜欢加载很多的启动项&#xff0c;其实这也没什么不好的。现在的电脑为了受到更好的保护&#xff0c;往往在开机的时候就加载了一些启动项&#xff0c;如&#xff1a;杀毒软件&#…

七大罪过与如何避免

在整个本文中&#xff0c;我将在代码片段中使用Java&#xff0c;同时还将使用JUnit和Mockito 。 本文旨在提供示例测试代码&#xff0c;这些示例可以是&#xff1a; 难以阅读 难以维护 在这些示例之后&#xff0c;本文将尝试提供替代方法&#xff0c;这些替代方法可用于增强…

4 指针运算_C++用指针访问数组元素(学习笔记:第6章 08)

用指针访问数组元素[1]数组是一组连续存储的同类型数据&#xff0c;可以通过指针的算术运算&#xff0c;使指针依次指向数组的各个元素&#xff0c;进而可以遍历数组。定义指向数组元素的指针定义与赋值例&#xff1a;int a[10], *pa; pa&a[0]; 或 paa;等效的形式经过上述定…

asyncexec_如何安全使用SWT的显示器asyncExec

asyncexec大多数用户界面&#xff08;UI&#xff09;工具箱都是单线程的&#xff0c; SWT也不例外。 这意味着必须仅从单个线程&#xff08;即所谓的UI线程&#xff09;访问UI对象。 另一方面&#xff0c;应在后台线程中执行长时间运行的任务&#xff0c;以使UI保持响应。 这使…

属性面板 脚本_3.1 创建和使用脚本

在unity中&#xff0c;游戏物体的行为是通过组件来驱动的&#xff0c;我们可以通过内建的组件来给我们的游戏物体组合各种能力&#xff0c;尽管如此&#xff0c;要知道我们的需求永远是动态的&#xff0c;很快我们就会发现&#xff0c;内建的组件功能已经无法满足我们的需求&am…

新的JMetro JavaFX 11兼容版本

你好&#xff0c;我们又见面了&#xff01; 这次是一个新版本&#xff0c;该版本与JavaFX 11兼容。 继续阅读以获取详细信息。 JMetro 8.5.7和11.5.7版本 JMetro代码已分为2个分支。 master分支具有Java 8兼容的JMetro版本&#xff0c;“ 11”分支具有Java 11兼容的版本。 以…

vue加跨域代理静态文件404_解决vue本地环境跨域请求正常,版本打包后跨域代理不起作用,请求不到数据的方法——针对vue2.0...

问题&#xff1a;在本地使用了proxyTable代理可以正常跨域请求后台数据&#xff0c;打包上传后就无法获得后台的json文件。查看了相关资料可以用nginx进行解决。还可以使用命名环境变量&#xff0c;请求的时候进行判断&#xff0c;话不多说上干货module.exports merge(prodEnv…

tomee_使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部

tomee我有一个需要在完成某些工作时通知用户的应用程序。 它使用JSF和Primefaces&#xff0c;因此可以使用大气 &#xff08;也称为Push&#xff09;来实现这种通知。 但是另一个有趣的方法是使用嵌入在Java Web应用程序中的XMPP服务器。 好的&#xff0c;好的&#xff0c;您不…

板框导入_板框结构导入有问题?这几个问题最常见,附解决方法!

对于一些比较复杂的结构&#xff0c;Altium的处理能力有限&#xff0c;通常采用AutoCAD来进行设计&#xff0c;然后在Altium中执行菜单栏中“文件”→“导入”→DWG/DXF命令&#xff0c;选择需要导入的DXF文件即可。如果导入过程中出现了乱码&#xff0c;报错等问题要如何解决呢…

您如何使用硒来计算自动化测试的投资回报率?

跨浏览器测试是一种测试&#xff0c;需要大量的精力和时间。 通过不同的浏览器&#xff0c;操作系统&#xff0c;设备&#xff0c;屏幕分辨率测试Web应用程序&#xff0c;以评估针对各种受众的Web内容呈现的过程是一项活动。 特别是如果手动处理。 使用Selenium进行的自动跨浏览…

流量复制_详解Linux系统流量复制--gor、tcpcopy、nginx模块流量复制等

概述对于一些有并发要求的业务&#xff0c;特别是对接外部流量时&#xff0c;产品上线前一定要做的就是压力测试&#xff0c;但是常规的压力测试并不能覆盖所有情况。以gemeter、ab,、webbench、http_load为例&#xff0c;这些通过模拟请求的压测工具&#xff0c;只能发送特定的…

mongodb+java_Java EE + MongoDb与Apache TomEE和Jongo Starter项目

mongodbjava知道MongoDB和Java EE &#xff0c;但是您不确切地知道如何将它们集成在一起&#xff1f; 您是否阅读了很多有关该主题的内容&#xff0c;但没有找到适合该目的的解决方案&#xff1f; 这个入门项目适合您&#xff1a; 您将学习如何以一种时尚的方式使用MongoDB和J…

C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历

C语言天才&#xff01;想法奇异&#xff1f;还是逼格满满&#xff1f;一份国外C语言写的传奇简历作者用代码更新了自己的简历&#xff0c;是不是很接地气&#xff0c;特符合程序员的逼格。这是一份可读可执行的语言源文件&#xff0c;也是作者编码风格的体现。C语言源码&#x…

hash值 更改git_Git切换版本

Git切换版本有三种方式&#xff1a;1.基于哈希值切换》基于哈希值切换(推荐)&#xff0c;命令&#xff1a;git reset --hard 哈希值&#xff0c;哈希值从哪来&#xff0c;git reflog查看下就知道了&#xff0c;切换版本后&#xff0c;git reflog会发现有两个HEAD&#xff0c;别…

devc++ 文件未编译问题

点击 文件 然后点击关闭全部文件, 重新打开一下软件件就好了

候选JEP:记录和密封类型

马克赖因霍尔德&#xff08;Mark Reinhold &#xff09;本周在OpenJDK琥珀色开发者邮件列表上宣布了两个新的紧密相关的候选 JDK增强提案&#xff08; JEP&#xff09; &#xff0c;其帖子分别为“ 新候选JEP&#xff1a;359&#xff1a;记录&#xff08;预览&#xff09; ”和…