题目要求:
通过C语言编写一个程序,程序中需要有两个进程,假设这两个进程是A和B,通过这两个进程模拟一个类似QQ聊天的情景,A进程和B进程分别代表通话一方,A进程能够发消息给B进程,同时还能接收B进程发送过来的消息,同样的,B进程能发送消息给A,同时接收A进程发送来的消息。
socket网络编程有几个步骤:
服务器:
1.socket()函数
2.bind()函数
3.listen()函数
4.accept()函数
5.read(),write(),close()等一系列文件相关的函数
客户端:
1.socket()函数
2.connect()函数
3.read(),write(),close()等一系列文件相关的函数
一、服务器代码:
Server.c:
#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char **argv)
{
int s_fd;
int c_fd;
char msg[128]={0};
char readBuf[128]={0};
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
if(argc!=3)
{
printf("Number Error!\n");
exit(-1);
}
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd!=-1)
{
printf("Socket Success!\n");
}
else
{
printf("Socket Error!\n");
exit(-1);
}
s_addr.sin_family=AF_INET;
s_addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
listen(s_fd,10);
int len=sizeof(struct sockaddr_in);
while(1)
{
c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&len);
if(c_fd!=-1)
{
printf("Accept Success!\n");
}
else
{
printf("Accept Error!\n");
}
if(fork()==0)
{
while(1)
{
memset(readBuf,0,sizeof(readBuf));
read(c_fd,readBuf,sizeof(readBuf));
printf("FROM client:%s\n",readBuf);
}
}
else
{
while(1)
{
memset(msg,0,sizeof(msg));
printf("Inptu: ");
gets(msg);
write(c_fd,msg,strlen(msg));
}
}
}
return 0;
}
客户端代码:
client.c
#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
int main(int argc ,char **argv)
{
int c_fd;
int n_read;
int n;
char buf[128]={0};
char readBuf[128]={0};
struct sockaddr_in c_addr;
if(argc !=3)
{
printf("Number Error!\n");
exit(-1);
}
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd!=-1)
{
printf("Socket Success!\n");
}
else
{
printf("Socket Failed!\n");
exit(-1);
}
c_addr.sin_family=AF_INET;
c_addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
while(1)
{
n=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));
if(n==-1)
{
printf("Connect Faileed!\n");
exit(-1);
}
else
{
printf("Connect Success!\n");
}
if(fork()==0)
{
while(1)
{
memset(buf,0,sizeof(buf));
printf("Input: ");
gets(buf);
write(c_fd,buf,strlen(buf));
}
}
else
{
while(1)
{
memset(readBuf,0,sizeof(readBuf));
read(c_fd,readBuf,sizeof(readBuf));
printf("From Serever :%s\n",readBuf);
}
}
}
return 0;
}
我们的工程文件夹里面应该是有两个c文件的,一个服务器一个客户端。
编译
gcc server.c -o server
gcc client.c -o client
编译之后就会增加两个可执行文件。
然后ifconfig获得虚拟IP地址
如果输入ifconfig后为下面这样:
提示没有网络相关工具sudo apt install net-tools
下载就可以了
我们来看看结果:
输入./server 172.20.10.5 6666
然后回车运行,再Ctrl+a/t+t
重新打开一个终端在刚才的目录下面运行client
如图中所示:
大致完成!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)