PCがマルチコアなので、マルチスレッドのほうが効率がいいと
思ったのですが、CPU使用率が60%を上回る結果になりました。
Select()を用いた方法より格段にCPUを圧迫し、レスポンスも
悪くなっているような気がします。
単純にクライアントがきたら、もう片方の
ソケットに書き込む処理をするスレッドを起こす簡単なサーバです。
設計が根本的におかしいでしょうか?
それともスレッドの作り方や扱い方がまずいのでしょうか?
==================ここから============================
DWORD WINAPI Thread1(LPVOID lpvoid ) {
char buf1[4000];
while(1){
memset(buf1,'\0',4000);
int ret1;
Sleep(1);
ret1=recv(sock1, buf1,4000, 0);
send(sock2,buf1,ret1, 0);
}
ExitThread(TRUE);
}
DWORD WINAPI Thread2(LPVOID lpvoid ) {
char buf2[4000];
while(1){
memset(buf2,'\0',4000);
int ret2;
Sleep(1);
ret2=recv(sock2, buf2,4000, 0);
send(sock1,buf2,ret2, 0);
}
ExitThread(TRUE);
}
======================================================
マルチスレッドで動くサーバについて
Re:マルチスレッドで動くサーバについて
いかが問題のソースになります。
長くてすみません。
===============ここから=====================================
#include <stdio.h>
#include <conio.h>
#include <winsock2.h>
SOCKET sock1,sock2;
DWORD WINAPI Thread1(LPVOID lpvoid ) {
char buf1[4000];
while(1){
memset(buf1,'\0',4000);
int ret1;
Sleep(1);
ret1=recv(sock1, buf1,4000, 0);
send(sock2,buf1,ret1, 0);
}
ExitThread(TRUE);
}
DWORD WINAPI Thread2(LPVOID lpvoid ) {
char buf2[4000];
while(1){
memset(buf2,'\0',4000);
int ret2;
Sleep(1);
ret2=recv(sock2, buf2,4000, 0);
send(sock1,buf2,ret2, 0);
}
ExitThread(TRUE);
}
int main(void)
{
WSADATA wsaData;
struct sockaddr_in server1;
struct sockaddr_in server2;
DWORD dwParam1,dwParam2;
HANDLE hThread;
int n;
char buf[1024];
WSAStartup(MAKEWORD(2,0), &wsaData);
sock1= socket(AF_INET,SOCK_STREAM,0);
server1.sin_family = AF_INET;
server1.sin_port = htons(5900);
server1.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(sock1, (struct sockaddr *)&server1, sizeof(server1));
CreateThread(NULL , 0 , Thread1 ,(LPVOID)sock1 , 0 , &dwParam1);
printf("片方に接続しました\n");
sock2= socket(AF_INET,SOCK_STREAM,0);
server2.sin_family = AF_INET;
server2.sin_port = htons(6666);
server2.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(sock2, (struct sockaddr *)&server2, sizeof(server2));
CreateThread(NULL , 0 , Thread2 ,(LPVOID)sock2 , 0 , &dwParam2);
printf("両方に接続しています\n");
getch();
}
=====================ここまで==================================================
長くてすみません。
===============ここから=====================================
#include <stdio.h>
#include <conio.h>
#include <winsock2.h>
SOCKET sock1,sock2;
DWORD WINAPI Thread1(LPVOID lpvoid ) {
char buf1[4000];
while(1){
memset(buf1,'\0',4000);
int ret1;
Sleep(1);
ret1=recv(sock1, buf1,4000, 0);
send(sock2,buf1,ret1, 0);
}
ExitThread(TRUE);
}
DWORD WINAPI Thread2(LPVOID lpvoid ) {
char buf2[4000];
while(1){
memset(buf2,'\0',4000);
int ret2;
Sleep(1);
ret2=recv(sock2, buf2,4000, 0);
send(sock1,buf2,ret2, 0);
}
ExitThread(TRUE);
}
int main(void)
{
WSADATA wsaData;
struct sockaddr_in server1;
struct sockaddr_in server2;
DWORD dwParam1,dwParam2;
HANDLE hThread;
int n;
char buf[1024];
WSAStartup(MAKEWORD(2,0), &wsaData);
sock1= socket(AF_INET,SOCK_STREAM,0);
server1.sin_family = AF_INET;
server1.sin_port = htons(5900);
server1.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(sock1, (struct sockaddr *)&server1, sizeof(server1));
CreateThread(NULL , 0 , Thread1 ,(LPVOID)sock1 , 0 , &dwParam1);
printf("片方に接続しました\n");
sock2= socket(AF_INET,SOCK_STREAM,0);
server2.sin_family = AF_INET;
server2.sin_port = htons(6666);
server2.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(sock2, (struct sockaddr *)&server2, sizeof(server2));
CreateThread(NULL , 0 , Thread2 ,(LPVOID)sock2 , 0 , &dwParam2);
printf("両方に接続しています\n");
getch();
}
=====================ここまで==================================================
Re:マルチスレッドで動くサーバについて
そもそも基本的なクライアント・サーバモデルにもなっていないのとスレッドを関数の様に使っているので、ちゃんと動くとは思えません。
まず、スレッドを使わないシングルなクライアント・サーバのソースを書いてみていただけませんか?
それと期待する動作の説明をお願いします。
まず、スレッドを使わないシングルなクライアント・サーバのソースを書いてみていただけませんか?
それと期待する動作の説明をお願いします。
Re:マルチスレッドで動くサーバについて
>softyaさん
どうやら、考え方が根本からおかしかったようですね。
掲示板の新システム移行が近いので続きはそちらにて
質問させていただきたいと思います。
ありがとうございました。
どうやら、考え方が根本からおかしかったようですね。
掲示板の新システム移行が近いので続きはそちらにて
質問させていただきたいと思います。
ありがとうございました。