CS架构:
第一种:实现一个服务端,多个客户端,能实现客户端与服务端的交互:tcp-fork
Server:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int serverfd;
int clientfd;
int ret;
// 1 、创建一个socket
serverfd = socket(AF_INET,SOCK_STREAM,0);
if(serverfd < 0)
{
perror("socket create fail");
return -1;
}
int reuse = 1;
ret = setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
printf("setsockopt ret=%d\n",ret);
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
memset(&serveraddr,0,sizeof(serveraddr));
memset(&clientaddr,0,sizeof(clientaddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = INADDR_ANY; //表示接受任意ip的请求
serveraddr.sin_port = htons(8000); //表示对应的端口号,客户端就可以通过这个端口进行通讯
// 2、绑定我们的地址和端口号,先初始化这个地址
ret = bind(serverfd,(struct sockaddr * )&serveraddr,sizeof(struct sockaddr_in));
if(ret < 0)
{
perror("bind fail");
close(serverfd);
return -1;
}
// 3、监听,是否有连接请求。
ret = listen(serverfd,10);
if(ret < 0)
{
perror("listen fail");
close(serverfd);
return -1;
}
while(1)
{
int cfd;
int sin_size = sizeof(struct sockaddr_in);
// 4 、接受新连接请求。
cfd = accept(serverfd, (struct sockaddr *)&clientaddr, &sin_size);
printf("New connection fd=%d IP:PORT [%s:%hu]\n",cfd,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
if(cfd < 0)
{
perror("accept fail");
close(cfd);
continue;
}
char buf[128];
memset(buf,0,128);