服务器的创建分为两个步骤:
1、建立socket;
2、创建线程。
两点内容的细节:
1、建立socket方面:
socket()
bind()
listen()
accept()
read()
write()
close()//关闭套接字时候在线程中关闭,而且只需关闭一次,在父进程中无须关闭socket,这一点不同于fork创建的进程。
相关的套接字API如上所示。
2、创建线程方面:
线程处理函数:
void* worker(void* arg);
pthread_create();
需要注意参数传递时要格式化成为void*的形式。
线程使用的tid方面,可以使用同一个tid,因为在线程处理函数中首先要分离线程。
连接方式:
在一个终端中打开服务器监听特定端口,在另一个终端或机器上telnet本socket即可连接。
server代码如下:
-
#include <unistd.h>
-
#include <sys/socket.h>
-
#include <arpa/inet.h>
-
#include <netinet/in.h>
-
#include <sys/types.h>
-
#include <pthread.h>
-
-
#include <iostream>
-
#include <stdlib.h>
-
#include <strings.h>
-
-
using namespace std;
-
-
void* worker(void* arg);
-
-
int main(int argc, char** argv){
-
if(argc != 3){
-
cout << "the usage: server ip port." << endl;
-
exit(1);
-
}
-
-
char* ip = argv[1];
-
int port = atoi(argv[2]);
-
-
pthread_t tid;
-
-
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
-
if(listenfd == -1){
-
cout << "socker() create failed." << endl;
-
exit(1);
-
}
-
-
struct sockaddr_in server;
-
bzero(&server, sizeof(server));
-
server.sin_family = AF_INET;
-
server.sin_port = htons(port);
-
inet_pton(AF_INET, ip, &server.sin_addr);
-
-
if(bind(listenfd, (struct sockaddr*)&server, sizeof(server)) != 0){
-
cout << "bind() failed." << endl;
-
exit(1);
-
}
-
-
if(listen(listenfd, 5) != 0){
-
cout << "listen() failed." << endl;
-
exit(1);
-
}
-
-
while(1){
-
-
struct sockaddr_in client;
-
socklen_t client_len = sizeof(client);
-
-
int sockfd = accept(listenfd, (struct sockaddr*)&client, &client_len);
-
if(sockfd == -1){
-
cout << "accept() error." << endl;
-
exit(1);
-
}
-
-
-
pthread_create(&tid, NULL, worker, (void*)sockfd);
-
-
// close(sockfd);
-
}
-
close(listenfd);
-
-
return 0;
-
}
-
-
-
void* worker(void* arg){
-
pthread_detach(pthread_self());
-
char buf[512];
-
bzero(&buf, sizeof(buf));
-
read((int)arg, &buf, 512);
-
write(STDOUT_FILENO, &buf, 512);
-
close((int)arg);
-
return NULL;
-
}
阅读(1751) | 评论(0) | 转发(0) |