一、tcp服务器
/*
* @Description: tcp并发服务器 ./tcp_server
* @Version: 1.0
* @Autor: zys
* @Date: 2020-09-29 10:58:00
* @LastEditors: zys
* @LastEditTime: 2020-09-30 12:27:13
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8080
#define SERVER_IP "192.168.2.136"
int server_fork(char *arg)
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buffer[1024];
int n,nbytes,sin_size;
//服务器端开始建立socketfd描述符
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0){
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
//服务器填充sockaddr结构
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);
server_addr.sin_port=htons(PORT);
//捆绑socketfd描述符到ip地址
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
if(bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr))<0)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
//设置允许连接的最大客户端数
if(listen(sockfd,1)==-1){
fprintf(stderr,"listen error:%s\n\a",strerror(errno));
exit(1);
}
while(1){
//服务器阻塞 直到客户端程序建立链接
printf("[%d]Wait connect..\n",getpid());
sin_size=sizeof(client_addr);
new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);
//new_fd=accept(sockfd,NULL,NULL);
if((new_fd<0) && (errno==EINTR)){
continue;
}
fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
if((n=fork())==0)
{
printf("[%d]fork1\n",getpid());
nbytes=read(new_fd,buffer,1024);
if(nbytes<0){
fprintf(stderr,"read error:%s\n\a",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("Server recv[%d]:%s\r\n",nbytes,buffer);
//close(sockfd);//为啥要关闭sockfd?
close(new_fd);
exit(0);
} else {
close(new_fd);
}
}
}
二、tcp客户端程序
/*
* @Description: tcp客户端程序 ./tcp_client运行之后 输入要发送的数据 点击回车即可
* @Version: 1.0
* @Autor: zys
* @Date: 2020-09-29 13:43:33
* @LastEditors: zys
* @LastEditTime: 2020-09-29 14:42:31
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8080
#define SERVER_IP "192.168.2.136"
int main(int argc,char *argv[])
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct in_addr addr;
struct hostent *host;
char buffer[1024];
int wbyte;
/*
if(argc!=2)
{
fprintf(stderr,"Usage:%s hostname\n\a",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"gethostbyname error:%s\n\a",strerror(errno));
exit(1);
}
*/
//服务器端开始建立socketfd描述符
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0){
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
//服务器填充sockaddr结构
inet_aton(SERVER_IP,&addr);
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr=addr;
//发起连接请求
if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"connect error:%s\n\a",strerror(errno));
exit(1);
}
printf("Connect ok\n");
fgets(buffer,1024,stdin);//等待输入数据
wbyte=write(sockfd,buffer,strlen(buffer));
printf("wbyte=%d\n",wbyte);
close(sockfd);
exit(0);
}
三、测试最大客户端数
/*
* @Description: tcp客户端程序 ./tcp_client 192.168.2.157 运行之后 创建多个客户端程序 以测试tcp服务器的最大链接数
* @Version: 1.0
* @Autor: zys
* @Date: 2020-09-29 13:43:33
* @LastEditors: zys
* @LastEditTime: 2020-09-30 13:00:46
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8080
#define SERVER_IP "192.168.2.136"
int main(int argc,char *argv[])
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct in_addr addr;
struct hostent *host;
char buffer[1024];
int wbyte,num=0;
if(argc!=2)
{
fprintf(stderr,"Please input server ip\n\a");
exit(1);
}
/*
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"gethostbyname error:%s\n\a",strerror(errno));
exit(1);
}
*/
while(1){
//服务器端开始建立socketfd描述符
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0){
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
//服务器填充sockaddr结构
inet_aton(argv[1],&addr);
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr=addr;
//发起连接请求
if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"connect error:%s\n\a",strerror(errno));
exit(1);
}
printf("Connect ok %d\n",num++);
//sleep(1);
}
//fgets(buffer,1024,stdin);//等待输入数据
//wbyte=write(sockfd,buffer,strlen(buffer));
//printf("wbyte=%d\n",wbyte);
close(sockfd);
exit(0);
}
服务器端程序跑在imx6ull上,支持到300左右就没在测试了,足够用了
Connect ok 294
Connect ok 295
Connect ok 296