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编程,并且实现通信功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米4系统定位服务器地址,小米4原装浏览
- 下一篇: ubuntu自定义安装里怎么选_超市里的