81 lines
2.3 KiB
C++
81 lines
2.3 KiB
C++
#include "common.h"
|
|
|
|
using namespace std;
|
|
int main(int argc,char* argv[])
|
|
{
|
|
int default_port = 8000;
|
|
int optch = 0;
|
|
while ((optch = getopt(argc, argv, "s:p:")) != -1)
|
|
{
|
|
switch (optch)
|
|
{
|
|
case 'p':
|
|
default_port = atoi(optarg);
|
|
LOGINFO("port: %s\n", optarg);
|
|
break;
|
|
case '?':
|
|
LOGINFO("Unknown option: %c\n", (char)optopt);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
pthread_mutex_init(&_mxMessage, NULL);
|
|
// pthread_mutex_lock(&_mxMessage); //lock the mutex
|
|
|
|
// pthread_mutex_unlock(&_mxMessage); //unlock the mutex
|
|
/*声明服务器地址和客户链接地址*/
|
|
struct sockaddr_in server_addr, client_addr;
|
|
socklen_t client_len;
|
|
|
|
/*声明服务器监听套接字和客户端链接套接字*/
|
|
int listen_fd,connect_fd;
|
|
|
|
/*(1) 初始化监听套接字listenfd*/
|
|
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (listen_fd == -1)
|
|
{
|
|
perror("Socket Error:");
|
|
return 0;
|
|
}
|
|
|
|
/*(2) 设置服务器sockaddr_in结构*/
|
|
bzero(&server_addr, sizeof(server_addr));
|
|
server_addr.sin_family = AF_INET;
|
|
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //任意地址
|
|
server_addr.sin_port = htons(default_port);
|
|
|
|
// 设置允许socket立即重用
|
|
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&listen_fd, sizeof(listen_fd));
|
|
|
|
/*(3) 绑定套接字和端口*/
|
|
if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
|
|
{
|
|
perror("Bind error:");
|
|
return 0;
|
|
}
|
|
|
|
/*(4) 监听客户请求*/
|
|
if (listen(listen_fd, 4) == -1)
|
|
{
|
|
perror("Listen error:");
|
|
return 0;
|
|
}
|
|
/*(5) 接受客户请求*/
|
|
for (;;)
|
|
{
|
|
client_len = sizeof(client_addr);
|
|
connect_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &client_len);
|
|
if (connect_fd < 0)
|
|
{
|
|
perror("accept error");
|
|
return 0;
|
|
}
|
|
LOGINFO("Connect from %s:%u...\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
|
|
int* argv = (int *)malloc(sizeof(int));
|
|
*argv = connect_fd;
|
|
CREATE_THREAD(NULL,1024*4,true,taskThread,(void*)argv,NULL);
|
|
}
|
|
close(listen_fd);
|
|
return 0;
|
|
} |