#include <iostream>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define SERVPORT 8000
struct s_cliinfo{
int connfd;
struct sockaddr_in cliaddr;
};
void process_cli(int fd, struct sockaddr_in cliaddr)
{
char recvbuff[1024];
struct msghdr msg;
struct iovec io;
io.iov_base = recvbuff;
io.iov_len = 1024;
msg.msg_name = &cliaddr;
msg.msg_namelen = sizeof(cliaddr);
msg.msg_iov = &io;
msg.msg_iovlen = 1;
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_flags = 0;
recvmsg(fd, &msg, 0);
std::cout<<"Data from client:\n"<<(char *)msg.msg_iov->iov_base<<std::endl;
close(fd);
}
void *start_routine(void *cliinfo)
{
pthread_detach(pthread_self());
int connfd;
char recvbuff[1024];
struct msghdr msg;
s_cliinfo *clidata;
struct sockaddr_in cliaddr;
clidata = (s_cliinfo *)cliinfo;
connfd = clidata->connfd;
cliaddr = clidata->cliaddr;
process_cli(connfd, cliaddr);
free(clidata);
return 0 ;
}
void start_server()
{
int connfd;
int listenfd;
socklen_t addrlen;
s_cliinfo *cliinfo;
pthread_t sock_handle_thread;
struct sockaddr_in cliaddr;
struct sockaddr_in servaddr;
memset(&cliaddr, 0, sizeof(cliaddr));
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVPORT);
servaddr.sin_addr.s_addr = INADDR_ANY;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
std::cout<<"Fail to create socket!\n";
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,&opt,sizeof(opt));
if(bind(listenfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
std::cout<<"Function bind() ERROR!\n";
exit(1);
}
if(listen(listenfd, 1024) < 0){
std::cout<<"Function listen() ERROR!\n";
exit(1);
}
addrlen = sizeof(cliaddr);
for(;;;){
if((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen)) < 0){
std::cout<<"Function accept() ERROR!\n";
exit(1);
}
cliinfo = (s_cliinfo *)malloc(sizeof(s_cliinfo));
if(cliinfo == NULL){
std::cout<<"Function malloc() ERROR!\n";
exit(1);
}
cliinfo->connfd = connfd;
memcpy(&(cliinfo->cliaddr), &cliaddr, sizeof(cliaddr));
if(pthread_create(&sock_handle_thread, NULL, start_routine, (void *)cliinfo)){
std::cout<<"Function pthread_create() ERROR!\n";
exit(1);
}
}
close(listenfd);
return ;
}
int main()
{
start_server();
return 0;
}
為什么用瀏覽器訪問一次卻回傳10次http請求!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/129784.html
標籤:網絡通信
上一篇:資料壓縮問題請教
下一篇:關于IP分片問題
