23,120
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <poll.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
int proxysvr_sock;
//设置非阻塞
static int SetNonBlocking(int sock)
{
int opts;
opts=fcntl(sock, F_GETFL, 0);
if(opts<0)
{
return -1;
}
opts = opts | O_NONBLOCK;
if(fcntl(sock,F_SETFL,opts)<0)
{
return -1;
}
}
static void *AcceptConnectionsThread(void *arg)
{
struct sockaddr_in sin; /* bind socket address */
socklen_t sinlen; /* length of address */
fd_set readfds;
fd_set errofds;
int ret, sock;
struct timeval timeo;
while (1)
{
FD_ZERO(&readfds);
FD_SET(proxysvr_sock, &readfds);
FD_ZERO(&errofds);
FD_SET(proxysvr_sock, &errofds);
timeo.tv_sec = 5;
timeo.tv_usec = 0;
ret = select(proxysvr_sock + 1, &readfds, (fd_set *)0, &errofds, NULL);
printf("ret = %d\n", ret);
if (ret == 0)
continue;
else if (ret < 0)
break;
if (FD_ISSET(proxysvr_sock, &errofds))
{
printf("exit ok!\n");
break;
}
sinlen = sizeof(sin);
if (FD_ISSET(proxysvr_sock, &readfds))
{
printf("read ok!\n");
if ((sock = accept(proxysvr_sock, (struct sockaddr *)&sin, &sinlen)) < 0)
{
break;
}
}
}
return NULL;
}
int socket_create_listen(int port, int reuse, int backlog)
{
int fd;
struct sockaddr_in addr;
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd < 0)
{
return -1;
}
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse, sizeof(int)) < 0)
{
printf("setsockopt SO_REUSEADDR error\n");
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(port);
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) != 0)
{
close(fd);
return -1;
}
SetNonBlocking(fd);//把客户端的socketFD设置为非阻塞
if (listen(fd, backlog) < 0)
{
close(fd);
return -1;
}
return fd;
}
int main()
{
int ret;
int port = 9990;
pthread_t rtspd_tid;
proxysvr_sock = socket_create_listen(port, 1, 100);
if (proxysvr_sock < 0)
return -1;
if ((ret = pthread_create(&rtspd_tid, NULL, AcceptConnectionsThread, (void *)NULL)) != 0)
{
close(proxysvr_sock);
proxysvr_sock = -1;
return -1;
}
while(1)
{
printf("wait for input...\n");
char c = getchar();
printf("c=%c\n", c);
if(c=='q')
break;
}
ret = close(proxysvr_sock);
printf("Ret = %d\n", ret);
if (ret != 0)
{
printf("socket close %d error\r\n", proxysvr_sock);
}
printf("ProxyServer_Uninitialize socket close %d\r\n", proxysvr_sock);
pthread_join(rtspd_tid, 0);
proxysvr_sock = -1;
return 0;
}