#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编程,并且实现通信功能相关推荐

  1. 阿里云Ubuntu系统安装Apache服务器

    安装步骤 在ubantu命令行中输入:sudo apt-get update(有些可能不需要这步) 输入:sudo apt-get install apache2,继续输入 y 就行 安装完成后输入: ...

  2. Ubuntu系统安装nginx服务器

    1.配置(环境变量)-编译 -工具安装 2.下载安装远程终端软件:winscp(传文件).securecrt(编译) 3.下载nginx源码压缩包:wget +下载地址 4./usr目录下增加子目录n ...

  3. ubuntu修改ntp服务器,Ubuntu搭建NTP服务器

    自己管理的一台Ubuntu服务器出现了时间错误,导致邮件发送显示的时间很有问题,因此痛定思痛,在这里花时间记录一下搭建ntp服务器 前言 自己管理的一台Ubuntu服务器出现了时间错误,导致邮件发送显 ...

  4. python socket服务器_记-python socket服务器端四部曲

    1.创建socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建一个TCPsocket对象\ 2.设置socket选项 s. ...

  5. ubuntu系统dhcp服务器,ubuntu如何启用dhcp服务器配置

    ubuntu如何启用dhcp服务器配置 内容精选 换一换 用户无法查询到弹性云服务器私网IP地址信息.本问题请按照以下思路进行排查处理.查看DHCP是否为启用状态检查是否存在dhclient进程检查弹 ...

  6. ubuntu系统dhcp服务器,ubuntu开启dhcp服务器配置

    ubuntu开启dhcp服务器配置 内容精选 换一换 IPv6的使用,可以有效弥补IPv4网络地址资源有限的问题.如果当前云服务器使用IPv4,那么启用IPv6后,云服务器可在双栈模式下运行,即云服务 ...

  7. python socket服务器多线程_Python多线程socket服务器端

    import threading import SocketServer import json import time class ThreadedTCPRequestHandler(SocketS ...

  8. [转|整理]翻译:使用.net3.5的缓存池和SocketAsyncEventArgs类创建socket服务器

    原文地址:http://www.cnblogs.com/onlytiancai/archive/2008/06/25/1229321.html http://www.cnblogs.com/killk ...

  9. linux系统 远程桌面连接到服务器,Ubuntu 14.04服务器远程桌面连接

    远程桌面连接Ubuntu 14.04服务器 Ubuntu 14.04.5 Server (64-bit) . 目的:希望给只有命令行的服务器加一个轻量级桌面xfce4 [xfce 4.10] 说明:由 ...

最新文章

  1. Kotlin 一个好用的新功能:Parcelize
  2. Android为TV端助力 转载:Java 泛型
  3. 11.1 问题描述及流程-机器学习笔记-斯坦福吴恩达教授
  4. 概率论 第四章 随机变量的数字特征
  5. rsa.FromXmlString 系统找不到指定的文件
  6. mysql 下一条数据_mysql 查询一条记录的下一条和上一条记录
  7. XnSay机器人授权系统源码
  8. 如何学计算机课程,一张图告诉你大学如何学好计算机专业课程
  9. springboot中mongodb自定义类型转换器
  10. vnpy2.0安装后报错ModuleNotFoundError: No module named 'vnpy.api.ctp.vnctpmd'
  11. 如何在windows2003(IIS6)下配置IIS,使其支持cshtml
  12. Zephry_安装与移植到Stm32F746g_disoc
  13. 基于Linux系统PXE启动DOS工具
  14. [luogu P2183] [国家集训队]礼物 {exlucas}
  15. Java架构师面试十大连环炮
  16. Codeforces364D Ghd【随机+检验】
  17. 企业邮箱的优势有哪些?使用企业邮箱的好处
  18. 材料力学——弯曲内力、弯曲应力
  19. Java从入门到放弃-序言
  20. 嬉皮笑脸面对明天的“难”

热门文章

  1. Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符
  2. jms spring_JMS和Spring:有时很重要的小事情
  3. Java Bullshifier –生成大量随机代码库
  4. ios plist 国际化_Java与iOS对话:Java对象与Apple plist序列化
  5. jpa 查询集合_避免懒惰的JPA集合
  6. 使用jOOQ DSL
  7. 让我们回顾一下如何通过JDBC插入Clob或Blob
  8. Java 8中的策略模式
  9. 按功能而不是按层打包课程
  10. Java – JDK 8的远景