基于TCP和Socket的Linux环境下简易聊天工具设计

  • 主要实现一个Linux下的局域网聊天工具的设计。
  • 该设计主要分为两部分,客户端部分和服务器端部分。

运行服务器端程序可以和任意一个运行了的客户端程序的进行通信,通信内容能够通过终端显示出来。两个部分都使用C语言,利用vim编辑器,通过tcp,套接口编程实现相关功能, gcc调试器调试成功.


这里写图片描述

####1. 客户端代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 6666
int main(int argc,char *argv[])
{
int s;
struct sockaddr_in server_addr;
s=socket(AF_INET,SOCK_STREAM,0);
if(s<0)
{
printf("socket error\n");
return -1;
}

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

inet_pton(AF_INET,argv[1],&server_addr.sin_addr);
connect(s,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
process_conn_client(s);
close(s);
return 0;
}

####2. 服务器代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 6666
#define BACKLOG 2

int main(int argc,char *argv[])
{
int ss,sc;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int err;
pid_t pid;

ss=socket(AF_INET,SOCK_STREAM,0);
if(ss<0)
{
printf("socket error\n");
return -1;
}

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

err=bind(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
if(err<0)
{
printf("bind error\n");
return -1;
}

err=listen(ss,BACKLOG);
if(err<0)
{
printf("listen error\n");
return -1;
}

for(;;)
{
socklen_t addrlen=sizeof(struct sockaddr);
sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);
if(sc<0)
{
continue;
}

pid=fork();
if(pid==0)
{  
    process_conn_server(sc);
    close(ss);
    }
else
{
    close(sc);
}
}
}

#####3.process

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 6666

void process_conn_client(int s)
{
ssize_t size=0;
char buffer[1024];
    for(;;)
    {
    size=read(0,buffer,1024);
    if(size>0)
        {
         write(s,buffer,size);
         size=read(s,buffer,1024);
         write(1,buffer,size);
         }
    }
}


void process_conn_server(int s)
{
ssize_t size=0;
char buffer[1024];
    for(;;)
{  
size=read(s,buffer,1024);
if(size==0)
{
return;
}
printf("%s",buffer);
sprintf(buffer,"%d bytes altogether\n",size);
write(s,buffer,strlen(buffer)+1);
}

}

github地址:https://github.com/liyifan687/TCP-Instant-Messenger

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章