1、流程
服务器:
创建socket;
绑定端口;
监听;
监听到有连接请求,接受请求;
建立连接,开始对话。
客户端:
创建socket;
请求建立连接;
连接建立成功,开始对话。
2、实例代码
//服务器客户端简单聊天工具之服务器(tcp/ip)
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<unistd.h>
#include<arpa/inet.h> //连接端口
#define PORT 6666 //最大连接数
#define CONNECTION 10
int main()
{
int sockfd, client_fd,sendnum,recvnum;
char inbuf[100],outbuf[100];
socklen_t addr_size;
pid_t pid;
struct sockaddr_in my_addr, client_addr; //socket创建
sockfd = socket(PF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail! \n");
return 1;
} //服务器的地址
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY; //绑定端口
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) < 0)
{
perror("bind fail! \n");
close(sockfd);
return 1;
} //开始监听
if(listen(sockfd,CONNECTION) < 0)
{
perror("listen fail! \n");
close(sockfd);
return 1;
}
addr_size = sizeof(struct sockaddr_in); //建立连接
if((client_fd = accept(sockfd,(void *)&client_addr,&addr_size)) < 0)
{
perror("accept fail! \n");
close(sockfd);
return 1;
}
printf("receive connection! \n"); //启动子进程
pid = fork();
if(pid < 0)
{
perror("fork fail! \n");
close(client_fd);
close(sockfd);
return 1;
} //子进程发送消息
else if(pid == 0)
{
while(1)
{
fgets(inbuf,sizeof(inbuf),stdin);
sendnum = send(client_fd,(void*)inbuf,sizeof(inbuf),0);
if(sendnum < 0)
{
perror("send fail! \n");
break;
}
}
} //父进程接收消息
else if(pid > 0)
{
while(1)
{
recvnum = recv(client_fd,(void*)outbuf,sizeof(outbuf),0);
if(recvnum < 0)
{
perror("recv fail! \n");
break;
}
if(recvnum == 0)
{
break;
}
printf("%s:%s",inet_ntoa(client_addr.sin_addr),outbuf);
}
}
close(client_fd);
close(sockfd);
return 0;
} //服务器客户端简单聊天工具之客户端(tcp/ip)
#include<stdio.h>
#include<errno.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<arpa/inet.h>
#define PORT 6666 //连接端口
#define IP "127.0.0.1"
int main()
{
int sockfd,sendnum,recvnum;
char inbuf[100],outbuf[100];
pid_t pid;
struct sockaddr_in serv_addr; //socket创建
sockfd = socket(PF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail! \n");
return 1;
} //服务器的地址
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr(IP); //连接服务器
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) < 0)
{
perror("connect fail! \n");
close(sockfd);
return 1;
}
printf("connect sucessful! \n"); //启动子进程
pid = fork();
if(pid < 0)
{
perror("fork fail! \n");
close(sockfd);
return 1;
} //子进程发送消息
else if(pid == 0)
{
while(1)
{
fgets(inbuf,sizeof(inbuf),stdin);
sendnum = send(sockfd,(void*)inbuf,sizeof(inbuf),0);
if(sendnum < 0)
{
perror("send fail! \n");
break;
}
}
} //父进程接收消息
else if(pid > 0)
{
while(1)
{
recvnum = recv(sockfd,(void*)outbuf,sizeof(outbuf),0);
if(recvnum < 0)
{
perror("recv fail! \n");
break;
}
if(recvnum == 0)
{
break;
}
printf("%s:%s",inet_ntoa(serv_addr.sin_addr),outbuf);
}
}
close(sockfd);
return 0;
}