수다님 부탁드려요 1: 다수 통신 질문요 ㅠㅠ
지우
1:1통신 은만들었는데 1:다수 통신으로 변경하고싶습니다.
근데 어떻게 해야할지 모르겟어요 ㅠㅠ
이사이트있는 1:다수 통신 다운받아서 해볼려고 햇는데
어렵네요 ㅠㅠ 부탁드립니다. ㅠㅠㅠㅠㅠㅠㅠ
클라이 언트 입니다.!!
-------------------------------------------------------------------------------------------------------------------#include winsock2.h
#include windows.h
#include resource.h
#define bufsize 256
#define wm_async(wm_user + 1)
#define wm_asyncaccept(wm_user + 3)
#define wm_asyncaccept_1(wm_user + 4)
bool callback dlgproc_1(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
bool callback dlgproc_2(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
bool callback dlgproc_3(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
bool callback dlgproc_4(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
bool callback dlgproc_5(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
void errorhandling(char * temp);
bool initsocket(hwnd hwnd);
hinstance g_hinst;
hwnd hwnd_1, hwnd_2, hwnd_3;
lpctstr lpszclass=text(class);
wsadata wsadata;
char message[128];
char message_1[128];
char cle[128] = 클라이언트;
int strlen, ilist;
sockaddr_in servaddr, servaddr_1;
word wver;
socket hsocket, hsocket_1;
char serlp[128]=127.0.0.1, ip_all[128];
char ip_1[4]=127, ip_2[4]=0, ip_3[4]=0, ip_4[4]=1;
int apientry winmain(hinstance hinstance,hinstance hprevinstance
,lpstr lpszcmdparam,int ncmdshow)
{
g_hinst=hinstance;
dialogbox(g_hinst,makeintresource(idd_dialog1), hwnd_desktop, dlgproc_1);
return 0;
}
bool callback dlgproc_1(hwnd hwnd,uint imessage,wparam wparam,lparam lparam)
{
hwnd_1 = hwnd;
switch(imessage) {
case wm_initdialog:
setdlgitemtext(hwnd_1,idc_edit1, ip_1);
setdlgitemtext(hwnd_1,idc_edit2, ip_2);
setdlgitemtext(hwnd_1,idc_edit3, ip_3);
setdlgitemtext(hwnd_1,idc_edit4, ip_4);
return true;
case wm_command:
switch(wparam)
{
case idok:
getdlgitemtext(hwnd_1, idc_edit1, ip_1, 4);
getdlgitemtext(hwnd_1, idc_edit2, ip_2, 4);
getdlgitemtext(hwnd_1, idc_edit3, ip_3, 4);
getdlgitemtext(hwnd_1, idc_edit4, ip_4, 4);
wsprintf(ip_all,%s.%s.%s.%s,ip_1, ip_2, ip_3, ip_4);
enddialog(hwnd_1, 0);
dialogbox(g_hinst, makeintresource(idd_dialog2), hwnd_desktop, dlgproc_2);
return true;
case idcancel:
if(messagebox(hwnd_2, 종료하시겠습니까?,종료,mb_yesno) == idyes){
enddialog(hwnd_1, 0);
}
return true;
}
break;
}
return false;
}
bool callback dlgproc_2(hwnd hwnd,uint imessage,wparam wparam,lparam lparam)
{
hwnd_2 = hwnd;
static hwnd hlist, hedit;
static int i;
switch(imessage) {
case wm_initdialog:
hlist = getdlgitem(hwnd_2, idc_list1);
hedit = getdlgitem(hwnd_2, idc_edit5);
setdlgitemtext(hwnd_2,idc_edit1, ip_1);
setdlgitemtext(hwnd_2,idc_edit2, ip_2);
setdlgitemtext(hwnd_2,idc_edit3, ip_3);
setdlgitemtext(hwnd_2,idc_edit4, ip_4);
setfocus(getdlgitem(hwnd_2,idc_edit5));
sendmessage(hedit, em_setreadonly, true, 0);
i = 1;
sendmessage(hwnd_2,wm_command, idok,null);
sendmessage(hwnd, wm_seticon, true, (lparam)loadicon(g_hinst, makeintresource(idi_icon1)));
return true;
case wm_asyncaccept :
switch(wsagetselectevent(lparam)){
case fd_accept:
if(wsaasyncselect(hsocket, hwnd_2, wm_async, fd_read | fd_close) == socket_error){
errorhandling(wsaasyncselect error);
return false;
}
return true;
case fd_read :
strlen = recv(hsocket, message, sizeof(message),0);
ilist = sendmessage(hlist, lb_getcount, 0 ,0);
if(ilist 100)
sendmessage(hlist, lb_deletestring, 0, 0);
sendmessage(hlist, lb_addstring, 0, (lparam)message);
return true;
case fd_close :
closesocket(hsocket);
if(wsacleanup() != 0){
errorhandling(서버가 연결해재하다 실패했습니다);
return false;
}
else{
ilist = sendmessage(hlist, lb_getcount, 0 ,0);
if(ilist 100)
sendmessage(hlist, lb_deletestring, 0, 0);
sendmessage(hlist, lb_addstring, 0, (lparam)서버가 접속을 끊었습니다.);
sendmessage(hedit, em_setreadonly, true, 0);
i = 1;
setdlgitemtext(hwnd, idc_edit5, );
return true;
}
}
return true;
case wm_asyncaccept_1 :
switch(wsagetselectevent(lparam)){
case fd_accept:
if(wsaasyncselect(hsocket_1, hwnd_2, wm_async, fd_read | fd_close) == socket_error){
errorhandling(wsaasyncselect error);
return false;
}
return true;
case fd_read :
dialogbox(g_hinst, makeintresource(idd_dialog5), hwnd_desktop, dlgproc_5);
return true;
case fd_close :
closesocket(hsocket_1);
if(wsacleanup() != 0){
return false;
}
else{
ilist = sendmessage(hlist, lb_getcount, 0 ,0);
if(ilist 100)
sendmessage(hlist, lb_deletestring, 0, 0);
return true;
}
}
return true;
case wm_command:
switch(wparam)
{
case idok:
getdlgitemtext(hwnd_2, idc_edit1, ip_1, 4);
getdlgitemtext(hwnd_2, idc_edit2, ip_2, 4);
getdlgitemtext(hwnd_2, idc_edit3, ip_3, 4);
getdlgitemtext(hwnd_2, idc_edit4, ip_4, 4);
wsprintf(ip_all,%s.%s.%s.%s,ip_1, ip_2, ip_3, ip_4);
wver = makeword(2,2);
&if(wsastartup(wver, &wsadata) != 0){
errorhandling(wsastartup() error!);
return false;
}
hsocket = socket(pf_inet, sock_stream, ipproto_tcp);
hsocket_1 = socket(pf_inet, sock_stream, ipproto_tcp);
if(hsocket == invalid_socket){
errorhandling(hsocket() error!);
return false;
}
if(hsocket_1 == invalid_socket){
errorhandling(hsocket() error!);
return false;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_addr.s_addr = inet_addr(ip_all);
servaddr.sin_port = htons(9190);
memset(&servaddr_1, 0, sizeof(servaddr_1));
servaddr_1.sin_family = af_inet;
servaddr_1.sin_addr.s_addr = inet_addr(ip_all);
servaddr_1.sin_port = htons(9191);
if(connect(hsocket, (sockaddr*)&servaddr, sizeof(servaddr)) == socket_error){
errorhandling(connect() error!);
return false;
}
else{
sendmessage(hedit, em_setreadonly, false, 0);
i = 0;
}
if(connect(hsocket_1, (sockaddr*)&servaddr_1, sizeof(servaddr_1)) == socket_error){
errorhandling(connect() error!);
return false;
}
if(wsaasyncselect(hsocket, hwnd, wm_asyncaccept, fd_accept | fd_read | fd_close) == socket_error){
errorhandling(wsaasyncselect error);
return false;
}
if(wsaasyncselect(hsocket_1, hwnd, wm_asyncaccept_1, fd_accept | fd_read | fd_close) == socket_error){
errorhandling(wsaasyncselect error);
return false;
}
return true;
case idc_send_1 :
if(i == 1){
}
else{
getdlgitemtext(hwnd_2, idc_edit5, message, 128);
ilist = sendmessage(hlist, lb_getcount, 0 ,0);
if(ilist 100)
sendmessage(hlist, lb_deletestring, 0, 0);
wsprintf(message_1,%s : %s, cle, message);
sendmessage(hlist, lb_addstring, 0, (lparam)message_1);
send(hsocket, message_1, sizeof(message_1), 0);
setdlgitemtext(hwnd_2, idc_edit5, );
setfocus(getdlgitem(hwnd_2,idc_edit5));
}
return true;
case id_nic_name :
dialogbox(g_hinst,makeintresource(idd_dialog3), hwnd_desktop, dlgproc_3);
return true;
case id_message_1 :
dialogbox(g_hinst,makeintresource(idd_dialog4), hwnd_desktop, dlgproc_4);
return true;
case id_exit_1 :
case idcancel:
if(messagebox(hwnd_2, 연결을 끊으시겠습니까?,확인,mb_yesno) == idyes){
closesocket(hsocket);
wsacleanup();
enddialog(hwnd_2, 0);
}
return true;
}
break;
}
return false;
}
bool callback dlgproc_3(hwnd hwnd,uint imessage,wparam wparam,lparam lparam){
switch(imessage){
case wm_command :
switch(wparam){
case idok:
getdlgitemtext(hwnd, idc_edit1, cle, 128);
case idcancel :
enddialog(hwnd, 0);
return true;
}
break;
}
return false;
}
bool callback dlgproc_4(hwnd hwnd,uint imessage,wparam wparam,lparam lparam){
switch(imessage){
case wm_initdialog:
return true;
case wm_command :
switch(wparam){
case idok:
getdlgitemtext(hwnd, idc_edit1, message, 128);
send(hsocket_1, message, sizeof(message), 0);
case idcancel :
enddialog(hwnd, 0);
return true;
}
break;
}
return false;
}
bool callback dlgproc_5(hwnd hwnd,uint imessage,wparam wparam,lparam lparam){
switch(imessage){
case wm_initdialog:
strlen = recv(hsocket_1, message, sizeof(message),0);
setdlgitemtext(hwnd, idc_edit1, message);
return true;
case wm_command :
switch(wparam){
case idok:
dialogbox(g_hinst, makeintresource(idd_dialog4), hwnd_desktop, dlgproc_4);
case idcancel :
enddialog(hwnd, 0);
return true;
}
break;
}
return false;
}
void errorhandling(char *temp)
{
messagebox(null, temp, 알림,mb_ok);
}
클라이 언트 입니다.!!
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------서버 입니다.
#include winsock2.h
#include windows.h
#include commctrl.h
#include resource.h
#define bufsize 256
#define wm_async(wm_user + 1)
#define wm_async_1(wm_user + 2)
#define wm_asyncaccept(wm_user + 3)
#define wm_asyncaccept_1(wm_user + 4)
bool callback maindlgproc(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
bool callback maindlgproc_1(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
bool callback maindlgproc_2(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
bool callback maindlgproc_3(hwnd hwnd,uint imessage,wparam wparam,lparam lparam);
void errorhandling(char * temp);
bool initsocket(hwnd hwnd);
hinstance g_hinst;
hwnd hwndmain;
lpctstr lpszclass=text(class);
char server[128] = 서버;
static wordwver;
static wsadatawsadata;
static sockethservsock, hservsock_1;
static sockethclntsock, hclntsock_1;
static sockaddr_inclntaddr, clntaddr_1;
static sockaddr_inservaddr, servaddr_1;
static char temp[128], listbuf[128];
static charmessage[128]=hello world!\n, message_1[128];
static int szclntaddr,szclntaddr_1, strlen, ilist, i;
static hwnd hlist, hedit;
handle htimer;
systemtime st;
hwnd hstate;
char stime[128];
int apientry winmain(hinstance hinstance,hinstance hprevinstance
,lpstr lpszcmdparam,int ncmdshow)
{
g_hinst=hinstance;
dialogbox(g_hinst,makeintresource(idd_dialog1), hwnd_desktop, maindlgproc);
return 0;
}
bool callback maindlgproc(hwnd hwnd,uint imessage,wparam wparam,lparam lparam)
{intnbsp;int sbpart[2]={260,350}; //상태란의 크기
hwndmain = hwnd;
switch(imessage) {
case wm_initdialog:
htimer = (handle)settimer(hwnd, 1, 1000, null); //타이머 생성
hlist = getdlgitem(hwnd, idc_list1);
hedit = getdlgitem(hwnd, idc_edit1);
sendmessage(hedit, em_setreadonly, true,0);
sendmessage(hwnd, wm_seticon, true, (lparam)loadicon(g_hinst, makeintresource(idi_icon1)));
i = 1;
//상태란
hstate = createstatuswindow(ws_child | ws_visible, , hwnd, 0);
sendmessage(hstate, sb_setparts, 2, (lparam)sbpart);
wsprintf(listbuf,서버 연결 중...);
sendmessage(hstate, sb_settext, 0, (lparam)listbuf);
//시계
//상태란
return true;
case wm_timer:
getlocaltime(&st); //현재의 시간을 읽어온다.
wsprintf(stime, 오후 %d:%d:%d , st.whour, st.wminute, st.wsecond);
sendmessage(hstate, sb_settext, 1, (lparam)stime);
return true;
case wm_asyncaccept :
switch(wsagetselectevent(lparam)){
case fd_accept :
szclntaddr = sizeof(clntaddr);
hclntsock = accept(hservsock, (sockaddr*)&clntaddr, &szclntaddr);
if(hclntsock == invalid_socket){
errorhandling(accept error);
return false;
}
sendmessage(hedit, em_setreadonly, false,0);
i = 0;
wsprintf(listbuf, %s 접속중 . . ., inet_ntoa(clntaddr.sin_addr));
setdlgitemtext(hwnd, idc_edit2, listbuf);
sendmessage(hlist, lb_addstring, 0, (lparam)클라이언트가 접속했습니다);
if(wsaasyncselect(hclntsock, hwnd, wm_async, fd_read | fd_close) == socket_error){
errorhandling(wsaasyncselect error);
return false;
}
return true;
}
return true;
case wm_async :
switch(wsagetselectevent(lparam)){
case fd_read :
strlen = recv(hclntsock, message, sizeof(message),0);
ilist = sendmessage(hlist, lb_getcount, 0,0);
if(ilist = 100)
sendmessage(hlist, lb_deletestring, 0,0);
sendmessage(hlist, lb_addstring, 0, (lparam)message);return true;
case fd_close :
sendmessage(hedit, em_setreadonly, true,0);
i = 1;
setdlgitemtext(hwnd, idc_edit1, );
closesocket(hservsock);
closesocket(hservsock_1);
closesocket(hclntsock);
closesocket(hclntsock_1);
if(wsacleanup() != 0){
errorhandling(연결해재에러);
return false;
}
errorhandling(클라이언트가 연결을 끊었습니다.);
return true;
}
return true;
case wm_asyncaccept_1 :
switch(wsagetselectevent(lparam)){
case fd_accept :
szclntaddr_1 = sizeof(clntaddr_1);
hclntsock_1 = accept(hservsock_1, (sockaddr*)&clntaddr_1, &szclntaddr_1);
if(hclntsock_1 == invalid_socket){
errorhandling(accept error);
return false;
}
wsprintf(listbuf, %s 접속중 . . ., inet_ntoa(clntaddr_1.sin_addr));
setdlgitemtext(hwnd, idc_edit2, listbuf);
if(wsaasyncselect(hclntsock_1, hwnd, wm_async_1, fd_read | fd_close) == socket_error){
errorhandling(wsaasyncselect error);
return false;
}
return true;
}
return true;
case wm_async_1 :
switch(wsagetselectevent(lparam)){
case fd_read :
dialogbox(g_hinst,makeintresource(idd_dialog4), hwnd_desktop, maindlgproc_3);
return true;
case fd_close :
closesocket(hservsock);
closesocket(hservsock_1);
closesocket(hclntsock);
closesocket(hclntsock_1);
if(wsacleanup() != 0){
errorhandling(연결해재에러);
return false;
}
errorhandling(클라이언트가 연결을 끊었습니다.);
return true;
}
return true;
case wm_command:
switch(wparam)
{
case id_set_1 :
wver = makeword(2, 2);
if(wsastartup(wver, &wsadata) != 0){
errorhandling(sever wsastartup error!);
return false;
}
else
errorhandling(sever wsastartup succes!);
hservsock = socket(pf_inet, sock_stream, ipproto_tcp);
hservsock_1 = socket(pf_inet, sock_stream, ipproto_tcp);
if(hservsock == invalid_socket){
errorhandling(server socket0 error!);
return false;
}
else
errorhandling(sever socket succes!);
if(hservsock_1 == invalid_socket){
errorhandling(server socket error!);
return false;
}
else
errorhandling(sever socket1 succes!);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_port = htons(9190);
servaddr.sin_addr.s_addr = htonl(inaddr_any);
memset(&servaddr_1, 0, sizeof(servaddr_1));
servaddr_1.sin_family = af_inet;
servaddr_1.sin_port = htons(9191);
servaddr_1.sin_addr.s_addr = htonl(inaddr_any);
if(bind(hservsock, (sockaddr*)&servaddr, sizeof(servaddr)) == socket_error)
{
errorhandling(server binging error !);
return false;
}
else
errorhandling(sever binding succes!);
if(bind(hservsock_1, (sockaddr*)&servaddr_1, sizeof(servaddr_1)) == socket_error)
{
errorhandling(server binging error !);
return false;
}
else
errorhandling(sever binding1 succes!);
if(wsaasyncselect(hservsock, hwnd, wm_asyncaccept, fd_accept) == socket_error)
{
errorhandling(wsaasyncselect error);
return false;
}
else
errorhandling(wsaasyncselect succes);
if(wsaasyncselect(hservsock_1, hwnd, wm_asyncaccept_1, fd_accept) == socket_error)
{
errorhandling(wsaasyncselect error);
return false;
}
else
errorhandling(wsaasyncselect0 succes);
if(listen(hserten(hservsock, 1) == socket_error)
{
errorhandling(listen error);
return false;
}
else
errorhandling(server is listening);
if(listen(hservsock_1, 1) == socket_error)
{
errorhandling(listen1 error);
return false;
}
else
errorhandling(server is listening);
return true;
case id_dis_set_1 :
sendmessage(hedit, em_setreadonly, true,0);
i = 1;
setdlgitemtext(hwnd, idc_edit1, );
closesocket(hservsock);
closesocket(hservsock_1);
closesocket(hclntsock);
closesocket(hclntsock_1);
if(wsacleanup() == 0){
errorhandling(연결해재성공);
}
return true;
case idok:
if(i == 1){
}
else{
getdlgitemtext(hwnd, idc_edit1, message, 128);
ilist = sendmessage(hlist, lb_getcount, 0,0);
if(ilist = 100)
sendmessage(hlist, lb_deletestring, 0,0);
wsprintf(message_1,%s : %s, server, message);
send(hclntsock, message_1, sizeof(message_1), 0);
sendmessage(hlist, lb_addstring, 0, (lparam)message_1);
setdlgitemtext(hwnd, idc_edit1, );
}
return true;
case id_nic_name :
dialogbox(g_hinst,makeintresource(idd_dialog2), hwnd_desktop, maindlgproc_1);
return true;
case id_message_1 :
dialogbox(g_hinst,makeintresource(idd_dialog3), hwnd_desktop, maindlgproc_2);
return true;
case id_exit_1 :
case idcancel:
killtimer(hwnd, 1); //타이머 해제
closesocket(hservsock);
closesocket(hservsock_1);
closesocket(hclntsock);
closesocket(hclntsock_1);
wsacleanup();
errorhandling(연결해재성공);
messagebox(hwnd,서버 프로그램을 종료 합니다,확인,mb_ok);
enddialog(hwnd, 0);
return true;
}
break;
}
return false;
}
bool callback maindlgproc_1(hwnd hwnd,uint imessage,wparam wparam,lparam lparam){
switch(imessage) {
case wm_command :
switch(wparam){
case idok :
getdlgitemtext(hwnd, idc_edit1, server, 128);
enddialog(hwnd, 0);
return true;
case idcancel :
enddialog(hwnd, 0);
return true;
}
break;
}
return false;
}
bool callback maindlgproc_2(hwnd hwnd,uint imessage,wparam wparam,lparam lparam){
switch(imessage) {
case wm_initdialog:
return true;
case wm_command :
switch(wparam){
case idok :
getdlgitemtext(hwnd, idc_edit1, message, 128);
send(hclntsock_1, message, sizeof(message), 0);
enddialog(hwnd, 0);
return true;
case idcancel :
enddialog(hwnd, 0);
return true;
}
break;
}
return false;
}
bool callback maindlgproc_3(hwnd hwnd,uint imessage,wparam wparam,lparam lparam){
switch(imessage) {
case wm_initdialog:
strlen = recv(hclntsock_1, message, sizeof(message),0);
setdlgitemtext(hwnd, idc_edit1, message);
return true;
case wm_command :
switch(wparam){
case idok :
dialogbox(g_hinst,makeintresource(idd_dialog3), hwnd_desktop, maindlgproc_2);
enddialog(hwnd, 0);
return true;
case idcancel :
enddialog(hwnd, 0);
return true;
}
break;
}
return false;
}
void errorhandling(char *temp)
{
setdlgitemtext(hwndmain, idc_edit2, temp);
}