TCP并发服务器
NOTE(重重难难点):
socket返回的套接字描述符和accept返回的套接字描述符???
S: accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。此时我们需要区分两种套接字,一种套接字正如accept的参数sockfd,它是监听套接字,在调用listen函数之后,一个套接字会从主动连接的套接字变身为一个监听套接字;而accept返回是一个连接套接字,它代表着一个网络已经存在的点点连接。
TCP并发服务器代码:
#服务器
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#define portnum 3333
int main()
{
int sockfd;
int new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buffer[128];
int sin_size;
//1. 创建套接字
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
printf("create socket error!");
exit(1);
}
//2. 绑定地址
bzero(&server_addr, sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET; //协议族
server_addr.sin_port = htons(portnum); //端口号 主机字节序->网络字节序
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 可以使用主机任意一个ip地址 主机字节序->网络字节序
//绑定
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
//3. 监听端口
listen(sockfd,5);//5-允许连接客户机的数目
while(1)
{
//4. 等待连接
sin_size = sizeof(struct sockaddr);
new_fd = accept(sockfd,(struct sockaddr *)&client_addr, &sin_size);
printf("server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
//创建子进程,由子进程处理数据
int pid;
pid = fork();
if(pid == 0)
{
//5. 收发数据
int nbyte;//实际接受的长度
nbyte = recv(new_fd,buffer,128,0); //使用连接产生的新的fd
buffer[nbyte]='\0';
printf("server received: %s\n",buffer);
//5. 结束连接
close(new_fd);
}
else if(pid < 0)
printf("fork err\n");
}
close(sockfd);
return 0;
}
#客户端
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#define portnum 3333
int main()
{
int sockfd;
struct sockaddr_in server_addr;
char buffer[128];
//1.创建套接字
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
printf("create socket error");
exit(1);
}
//2.请求连接
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnum);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.103");
int con_s;
con_s = connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));
if(con_s == -1)
{
printf("connect fail!\n");
exit(1);
}
//3.收发数据
printf("Please input some char: \n");
fgets(buffer,128,stdin);
send(sockfd,buffer,strlen(buffer),0);
//4.关闭连接
close(sockfd);
return 0;
}