050923ServerFlame
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <netdb.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/event.h>
#define BUF_LEN 65536
int
new_accept(int sock){
int len;
int new_socket;
struct sockaddr_in peer_sin;
len = sizeof(peer_sin);
new_socket = accept(sock, (struct sockaddr*)&peer_sin, &len);
if ( new_socket == -1 ){
perror("accept");
exit(1);
}
}
void
read_sock(int sock){
int read_size;
int ret;
char buf[BUF_LEN];
/* recvよりreadの方が早い?
read_size =recv(sock, buf , BUF_LEN, 0);
*/
read_size = read(sock, buf, sizeof(buf)-1);
if ( read_size == -1 ){
perror("read");
} else if ( read_size == 0 ){
ret = close(sock);
if ( ret == -1 ){
perror("close");
exit(1);
}
} else {
if (buf[0] == 'w') {
/* 書き込み処理 */
}
else if(buf[0] == 'r') {
/* 読み込み処理 */
}
else {
/* エラーの予感 */
}
// write(sock, buf, read_size);
}
}
int
main(){
int sock_optval = 1;
int ret;
int port = 10080;
int listening_socket;
struct sockaddr_in sin;
int kev_regist_num;
int kq;
struct kevent kev[100];
int listening_socket = socket(AF_INET, SOCK_STREAM, 0);
if ( setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR,
&sock_optval, sizeof(sock_optval)) == -1 ){
perror("setsockopt");
exit(1);
}
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(listening_socket, (struct sockaddr *)&sin, sizeof(sin));
if ( ret == -1 ){
perror("bind");
exit(1);
}
ret = listen(listening_socket, SOMAXCONN);
if ( ret == -1 ){
perror("listen");
exit(1);
}
kq = kqueue();
if ( kq == -1 ){
perror("kqueue");
exit(1);
}
EV_SET(&kev[0], listening_socket, EVFILT_READ,EV_ADD, 0, 0, NULL);
ret = kevent(kq, &kev[0], 1, NULL, 0, NULL);
if ( ret == -1 ){
perror("kevent");
exit(1);
}
kev_regist_num=1;
/* main */
while (1){
int n;
struct timespec waitspec;
waitspec.tv_sec = 2;
waitspec.tv_nsec = 500000;
n = kevent(kq, kev, kev_regist_num, kev, sizeof(kev)/sizeof(kev[0]), &waitspec);
if ( n == -1 ){
perror("kevent");
exit(1);
} else if ( n > 0 ){
kev_regist_num=0;
for ( int i=0 ; i<n ; i++ ){
int sock = kev[i].ident;
if ( sock == listening_socket ){
/* 新しいClient*/
int new_sock = new_accept(sock);
if ( new_sock != -1 ){
new_client++;
}
} else {
/* ソケット読み込み */
read_sock(sock);
}
}
if (kev_regist_num != 0) {
n = kevent(kq, kev, kev_regist_num, NULL, 0, NULL);
if ( n == -1 ){
perror("kevent");
exit(1);
}
}
}
}
close(listening_socket);
return 0;
}
#include <stdlib.h>
#include <time.h>
#include <netdb.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/event.h>
#define BUF_LEN 65536
int
new_accept(int sock){
int len;
int new_socket;
struct sockaddr_in peer_sin;
len = sizeof(peer_sin);
new_socket = accept(sock, (struct sockaddr*)&peer_sin, &len);
if ( new_socket == -1 ){
perror("accept");
exit(1);
}
return new_socket;
}
void
read_sock(int sock){
int read_size;
int ret;
char buf[BUF_LEN];
/* recvよりreadの方が早い?
read_size =recv(sock, buf , BUF_LEN, 0);
*/
read_size = read(sock, buf, sizeof(buf)-1);
if ( read_size == -1 ){
perror("read");
} else if ( read_size == 0 ){
ret = close(sock);
if ( ret == -1 ){
perror("close");
exit(1);
}
} else {
if (buf[0] == 'w') {
/* 書き込み処理 */
}
else if(buf[0] == 'r') {
/* 読み込み処理 */
}
else {
/* エラーの予感 */
}
// write(sock, buf, read_size);
}
}
int
main(){
int sock_optval = 1;
int ret;
int port = 10080;
int listening_socket;
struct sockaddr_in sin;
int kev_regist_num;
int kq;
struct kevent kev[100];
int listening_socket = socket(AF_INET, SOCK_STREAM, 0);
if ( setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR,
&sock_optval, sizeof(sock_optval)) == -1 ){
perror("setsockopt");
exit(1);
}
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(listening_socket, (struct sockaddr *)&sin, sizeof(sin));
if ( ret == -1 ){
perror("bind");
exit(1);
}
ret = listen(listening_socket, SOMAXCONN);
if ( ret == -1 ){
perror("listen");
exit(1);
}
kq = kqueue();
if ( kq == -1 ){
perror("kqueue");
exit(1);
}
EV_SET(&kev[0], listening_socket, EVFILT_READ,EV_ADD, 0, 0, NULL);
ret = kevent(kq, &kev[0], 1, NULL, 0, NULL);
if ( ret == -1 ){
perror("kevent");
exit(1);
}
kev_regist_num=1;
/* main */
while (1){
int n;
struct timespec waitspec;
waitspec.tv_sec = 2;
waitspec.tv_nsec = 500000;
n = kevent(kq, kev, kev_regist_num, kev, sizeof(kev)/sizeof(kev[0]), &waitspec);
if ( n == -1 ){
perror("kevent");
exit(1);
} else if ( n > 0 ){
kev_regist_num=0;
for ( int i=0 ; i<n ; i++ ){
int sock = kev[i].ident;
if ( sock == listening_socket ){
/* 新しいClient*/
int new_sock = new_accept(sock);
if ( new_sock != -1 ){
EV_SET(&kev[kev_regist_num++], new_sock, EVFILT_READ, EV_ADD, 0, 0, NULL);
new_client++;
}
} else {
/* ソケット読み込み */
read_sock(sock);
}
}
if (kev_regist_num != 0) {
n = kevent(kq, kev, kev_regist_num, NULL, 0, NULL);
if ( n == -1 ){
perror("kevent");
exit(1);
}
}
}
}
close(listening_socket);
return 0;
}
2005年09月26日(月) 00:56:09 Modified by chin2shu3