- 主要實現一個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