1. 程式人生 > >基於TCP和Socket的Linux環境下簡易聊天工具設計

基於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