一、流程图
二、代码实例
1、client.c
#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET; //选择协议族为IPV4
serv_addr.sin_port = htons(9000); //连接到的服务器端口,服务器监听这个地址
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
{
printf("inet_pton() failed exit!\n");
exit(1);
}
if(connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("connect() failed exit!\n");
exit(1);
}
int len;
char recvline[1024];
char writeline[1024];
while(1)
{
memset(recvline, 0, sizeof(recvline));
memset(writeline, 0, sizeof(writeline));
//发送消息
printf("send to server:");
fgets(writeline,sizeof(writeline),stdin);
write(sockfd,writeline,strlen(writeline));
len = read(sockfd,recvline,1024);
if(len == 0)
{
printf("server is close");
}
printf("receive from server:%s\n",recvline);
}
close(sockfd); //关闭套接字
printf("end exit !\n");
return 0;
}
2、sever.c
#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serv_addr; //服务器的地址结构体
memset(&serv_addr,0,sizeof(serv_addr));
//设置本服务器要监听的地址和端口,这样客户端才能连接到该地址和端口并发送数据
serv_addr.sin_family = AF_INET; //选择协议族为IPV4
serv_addr.sin_port = htons(9000); //绑定我们自定义的端口号,客户端程序和我们服务器程序通讯时,就要往这个端口连接和传送数据
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //监听本地所有的IP地址;INADDR_ANY表示的是一个服务器上所有的网卡(服务器可能不止一个网卡)多个本地ip地址都进行绑定端口号,进行侦听。
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 32);
int connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
char recvline[1024];
char writeline[1024];
for(;;)
{
memset(recvline, 0, sizeof(recvline));
memset(writeline, 0, sizeof(writeline));
int len = read(connfd,recvline,sizeof(recvline));
if(len==0)//表示断开连接
{
printf("client is close....\n");
}
printf("receive from client:%s",recvline);
printf("send to client:");
fgets(writeline,sizeof(writeline),stdin);
//发送数据包给客户端
write(connfd,writeline,strlen(writeline)); //注意第一个参数是accept返回的connfd套接字
//只给客户端发送一个信息,然后直接关闭套接字连接;
}
close(connfd);
close(listenfd);
return 0;
}