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;
}
客户端代码:
ubuntu系统安装socket服务器,Ubuntu上进行socket编程,并且实现通信功能相关推荐
- 阿里云Ubuntu系统安装Apache服务器
安装步骤 在ubantu命令行中输入:sudo apt-get update(有些可能不需要这步) 输入:sudo apt-get install apache2,继续输入 y 就行 安装完成后输入: ...
- Ubuntu系统安装nginx服务器
1.配置(环境变量)-编译 -工具安装 2.下载安装远程终端软件:winscp(传文件).securecrt(编译) 3.下载nginx源码压缩包:wget +下载地址 4./usr目录下增加子目录n ...
- ubuntu修改ntp服务器,Ubuntu搭建NTP服务器
自己管理的一台Ubuntu服务器出现了时间错误,导致邮件发送显示的时间很有问题,因此痛定思痛,在这里花时间记录一下搭建ntp服务器 前言 自己管理的一台Ubuntu服务器出现了时间错误,导致邮件发送显 ...
- python socket服务器_记-python socket服务器端四部曲
1.创建socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建一个TCPsocket对象\ 2.设置socket选项 s. ...
- ubuntu系统dhcp服务器,ubuntu如何启用dhcp服务器配置
ubuntu如何启用dhcp服务器配置 内容精选 换一换 用户无法查询到弹性云服务器私网IP地址信息.本问题请按照以下思路进行排查处理.查看DHCP是否为启用状态检查是否存在dhclient进程检查弹 ...
- ubuntu系统dhcp服务器,ubuntu开启dhcp服务器配置
ubuntu开启dhcp服务器配置 内容精选 换一换 IPv6的使用,可以有效弥补IPv4网络地址资源有限的问题.如果当前云服务器使用IPv4,那么启用IPv6后,云服务器可在双栈模式下运行,即云服务 ...
- python socket服务器多线程_Python多线程socket服务器端
import threading import SocketServer import json import time class ThreadedTCPRequestHandler(SocketS ...
- [转|整理]翻译:使用.net3.5的缓存池和SocketAsyncEventArgs类创建socket服务器
原文地址:http://www.cnblogs.com/onlytiancai/archive/2008/06/25/1229321.html http://www.cnblogs.com/killk ...
- linux系统 远程桌面连接到服务器,Ubuntu 14.04服务器远程桌面连接
远程桌面连接Ubuntu 14.04服务器 Ubuntu 14.04.5 Server (64-bit) . 目的:希望给只有命令行的服务器加一个轻量级桌面xfce4 [xfce 4.10] 说明:由 ...
最新文章
- Kotlin 一个好用的新功能:Parcelize
- Android为TV端助力 转载:Java 泛型
- 11.1 问题描述及流程-机器学习笔记-斯坦福吴恩达教授
- 概率论 第四章 随机变量的数字特征
- rsa.FromXmlString 系统找不到指定的文件
- mysql 下一条数据_mysql 查询一条记录的下一条和上一条记录
- XnSay机器人授权系统源码
- 如何学计算机课程,一张图告诉你大学如何学好计算机专业课程
- springboot中mongodb自定义类型转换器
- vnpy2.0安装后报错ModuleNotFoundError: No module named 'vnpy.api.ctp.vnctpmd'
- 如何在windows2003(IIS6)下配置IIS,使其支持cshtml
- Zephry_安装与移植到Stm32F746g_disoc
- 基于Linux系统PXE启动DOS工具
- [luogu P2183] [国家集训队]礼物 {exlucas}
- Java架构师面试十大连环炮
- Codeforces364D Ghd【随机+检验】
- 企业邮箱的优势有哪些?使用企业邮箱的好处
- 材料力学——弯曲内力、弯曲应力
- Java从入门到放弃-序言
- 嬉皮笑脸面对明天的“难”