//使用pthread线程库
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdlib.h>
#define PORT 1234 //服务器端口
#define BACKLOG 5 //listen队列等待的连接数
#define MAXDATASIZE 1024 //缓冲区大小
void process_cli(int connectfd, struct sockaddr_in client); //客户端请求处理函数
void* start_routine(void* arg); //线程函数
typedef struct _ARG {
int connfd;
struct sockaddr_in client;
}ARG; //客户端结构体
main()
{
int listenfd, connectfd; //socket描述符
pthread_t thread; //线程体变量
ARG *arg; //客户端结构体变量
struct sockaddr_in server; //服务器地址信息结构体
struct sockaddr_in client; //客户端地址信息结构体
int sin_size;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //调用socket,创建监听客户端的socket
perror("Creating socket failed.");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //设置socket属性,端口可以重用
//初始化服务器地址结构体
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { //调用bind,绑定地址和端口
perror("Bind error.");
exit(1);
}
if(listen(listenfd,BACKLOG) == -1){ //调用listen,开始监听
perror("listen() error\n");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
while(1)
{
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,(socklen_t *)&sin_size))==-1) {
//调用accept,返回与服务器连接的客户端描述符
perror("accept() error\n");
exit(1);
}
arg = new ARG;
arg->connfd = connectfd;
memcpy(&arg->client, &client, sizeof(client));
if (pthread_create(&thread, NULL, start_routine, (void*)arg)) { //创建线程,以客户端连接为参数,start_routine为线程执行函数
perror("Pthread_create() error");
exit(1);
}
}
close(listenfd); //关闭监听socket
}
void process_cli(int connectfd, sockaddr_in client)
{
int num;
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];
printf("You got a connection from %s. ",inet_ntoa(client.sin_addr) );
num = recv(connectfd, cli_name, MAXDATASIZE,0);
if (num == 0) {
close(connectfd);
printf("Client disconnected.\n");
return;
}
cli_name[num - 1] = '\0';
printf("Client's name is %s.\n",cli_name);
while (num = recv(connectfd, recvbuf, MAXDATASIZE,0)) {
recvbuf[num] = '\0';
printf("Received client( %s ) message: %s",cli_name, recvbuf);
for (int i = 0; i < num - 1; i++) {
sendbuf[i] = recvbuf[num - i
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新高等教育linux下一个多线程并发服务器的实例全文阅读和word下载服务。
相关推荐: