![ceddad7e3672053ebac0de6ef49ae069.png](https://i-blog.csdnimg.cn/blog_migrate/5612fd40fde7c83e6c6a492c59cb65aa.jpeg)
linux环境下网络编程—设计并发服务器
利用多线程构建TCP并发服务器,并实现客户端和服务器的传输(多个并发用户同时访问服务器)
普通基于TCP的服务器端
创建一个socket调用socket()à绑定IP地址、端口号等信息到socket上调用bind()函数à监听客户端的连接请求,并设置允许的最大连接数调用listen()函数à接收客户端上的连接调用accept()函数à收发数据调用send()recv()/read()write()à关闭网络连接
普通基于TCP的客户端
创建一个socket调用socket()à设置要连接的对方主机地址和端口号等属à连接服务器调用connect()à收发数据调用send()recv()/read()write()à关闭网络连接
多线程构建TCP并发服务器,并实现客户端和服务器的传输(多个并发用户同时访问服务器)
创建一个socket调用socket()à绑定IP地址、端口号等信息到socket上调用bind()函数à监听客户端的连接请求,并设置允许的最大连接数调用listen()函数à接收客户端上的连接调用accept()函数à创建多线程,调用函数收发数据调用send()recv()/read()write()à关闭网络连接
【线程的创建函数原型:int pthread_create (pthread_t *tidp , const pthread_attr *attr, void *(*start_rtn)(void),void *arg)】
1、tcp_server_pthead.c
#include #include #include #include #include #include #include #include #include #include #define PORT 1234 #define BACKLOG 2 //最大连接数 void *start_routine( void *ptr) { int fd = *(int *)ptr; char buf[100]; int numbytes; int i,c=0; printf("this is a new thread,you got connected"); printf("fd=%d",fd); if ((numbytes=recv(fd,buf,100,0)) == -1){ //读数据 printf("recv() error"); exit(1); } char str[100]; char buffer[100]; //将收到的字符串反转 toclient for(c=0; c
2、tcp_client_pthread.c
#include #include #include #include #include #include #include #include #include #define PORT 1234 #define MAXDATASIZE 100 char receiveM[100]; char sendM[100]; int main(int argc, char *argv[]){ int fd, numbytes; struct hostent *he; struct sockaddr_in server; //检查用户输入,如果用户输入不正确,提示用户正确的输入方法 if (argc !=2) { printf("Usage: %s ",argv[0]); exit(1); } // 通过函数 gethostbyname()获得字符串形式的ip地址,并赋给he使用hostname查询host 名字 if ((he=gethostbyname(argv[1]))==NULL) { printf("gethostbyname() error"); exit(1); } // 产生套接字fd客户程序开始建立 sockfd描述符 if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1) { printf("socket() error"); exit(1); } /* 客户程序填充服务端的资料 */ bzero(&server,sizeof(server));//初始化置0 server.sin_family = AF_INET; //ipv4 server.sin_port = htons(PORT); (将本机器上的short数据转化为网络上的short数据)端口号server.sin_addr = *((struct in_addr *)he->h_addr); // IP地址/* 客户程序发起连接请求 */ if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1) { printf("connect() error"); exit(1); } // 向服务器发送数据 printf("send message to server:"); fgets(sendM,100,stdin); int send_le; send_le=strlen(sendM); sendM[send_le-1]='0'; send(fd,sendM,strlen(sendM),0); // 从服务器接收数据 if ((numbytes=recv(fd,receiveM,MAXDATASIZE,0)) == -1) { printf("recv() error"); exit(1); } printf("receive message from server:%s",receiveM); close(fd); /* 结束通讯 */ }
![9364c7f07e6d6bb9d923cae13ad17ac1.png](https://i-blog.csdnimg.cn/blog_migrate/e5a55d839171f3b1ef166d2ece650891.jpeg)
需要训练营地址后台私信“1”获取