소켓프로그래밍 관련 글입니다. 질문있습니다.!!!

yksoo00의 이미지

안녕하세요 이번에 과제때문에 만들었다기보다는 사람사람껄 비주얼 스튜디오 2010버전에 적용할려고 조금 바꾸었는데 cmd를 이용해 실행하던 도중 계속 이상해져서 해결하지 못해 여기에 올리게 되었습니다.
서버
< code >
#include
#include
#pragma comment(lib, "ws2_32")
#define MAXLINE 511
#define MAX_SOCK 1024
#define _CRT_SECURE_NO_WARINGS
char *EXIT_STRING = "exit";
char *START_STRING = "Connected to chat_server \n";
int maxfdp1;

int same = 1;
int clisock_list[MAX_SOCK];
int welcomecheck = 0;
int play = 0;
int num_chat = 0;
int round1 = 0;
int round1max = 0;
int round1chat = 0;
int max = 0;
int round1win = 0;
int tmp = 0;
int round1notice = 0;
int score[100];
int scoremax = 0;
int money[100];
int number = 1;
int end = 1;
void addClient(int s, struct sockaddr_in *newcliaddr);
void removeClient(int);
int set_nonblock(int sockfd);
int is_nonblock(int sockfd);
int tcp_listen(int host, int port, int backlog);
void errquit(char *mesg){
perror(mesg);
exit(1);
}
void addClient(int s, struct sockaddr_in *newcliaddr){
char buf[20];
inet_ntop(AF_INET, &newcliaddr -> sin_addr, buf, sizeof(buf));
printf("new client : %s\n", buf);

clisock_list[num_chat] = s;
num_chat++;
welcomecheck = 0;
}

void removeClient(int i){
_close(clisock_list[i]);
if(i != num_chat - 1)
clisock_list[i] = clisock_list[num_chat - 1];
num_chat--;
printf("채팅 참가자 1명 탈퇴. 현재 참가자 수 = %d\n", num_chat);
}

int tcp_listen(int host, int port, int backlog){
int sd;
struct sockaddr_in servaddr;

sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
perror("socket fail");
exit(1);
}
memset((char *)&servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(host);
servaddr.sin_port = htons(port);
if(bind(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
perror("bind fail"); exit(1);
}
listen(sd, backlog);
return sd;
}

int main(int argc, char *argv[]){
SOCKET hServSock, hClntSock,sd;
WSADATA wsaData;
struct sockaddr_in cliaddr;
struct sockaddr_in servaddr;
char buf[MAXLINE];
int i, j, k, nbyte, accp_sock, clilen, count;
int check = 1;
int c[100];
int winmax = 0;
int winnum = 0;
char win[100];
char playernum[100];
int rulecheck = 0;
char member[20];
char save[100];
char result[100];
char rmoney[100];
char rules[100];
int listen_sock;
char rule[] = "게임시작에 필요한 인원 2명 이상, 현재 : ";
for(k = 0; k < 100; k++){
score[k] = 0;
money[k] = 100;
}

for(k = 0; k < num_chat; k++){
c[k] = 0;
}

if(argc != 2){
printf("사용법 : %s port\n", argv[0]);
exit(0);
}
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) //윈속초기화
return 1;

listen_sock = tcp_listen(INADDR_ANY, atoi(argv[1]), 5);



for(count = 0; ; count++){
if(count == 100000){
fflush(stdout);
count = 0;
}
clilen = sizeof(cliaddr);
accp_sock = accept(listen_sock, (struct sockaddr *)&cliaddr, &clilen);

if(accp_sock > 0){
clisock_list[num_chat] = accp_sock;

addClient(accp_sock, &cliaddr);
send(accp_sock, START_STRING, strlen(START_STRING), 0);
printf("%d번째 사용자 추가.\n", num_chat);
}
for(i = 0; i < num_chat; i++){
errno = 0;
if(welcomecheck == 0){ //처음으로 들어온사람에게 뿌려지는 메세지
welcomecheck = 1;

sprintf(rules, "g를 누르면 게임시작, 2명 이상필요 현재 %d명", num_chat);
send(clisock_list[i], rules, 100, 0);
}
nbyte = recv(clisock_list[i], buf, MAXLINE, 0);
if(nbyte == 0){
removeClient(i);
continue;
}
else if(nbyte == -1 && errno == EWOULDBLOCK)
continue;
if(strstr(buf, EXIT_STRING) != NULL){
removeClient(i);
continue;
}
check = strncmp(buf, "g", 1);
buf[nbyte] = 0;
if(num_chat >= 2 && check == 0){ //게임시작
for(j = 0; j < num_chat; j++){
send(clisock_list[j], "\n게임 시작", 20, 0);

sprintf(playernum, "\n%d번째 사람", j);
send(clisock_list[j], playernum, 20, 0);
}
play = 1;
}
else if(check == 0){ //게임시작 인원부족할 때
sprintf(member, "%d", num_chat);
if(rulecheck == 0){
strcat(rule, member);
strcat(rule, "명");
}
send(clisock_list[i], rule, 100, 0);
rulecheck = 1;
}
else{ //채팅
for(j = 0; j < num_chat; j++)
if((clisock_list[i] != clisock_list[j])){
if(buf[0] >= 48 && buf[0] <= 57){
}
else{
send(clisock_list[j], buf, nbyte, 0);
printf("%s\n", buf);
}
}
}
//게임시작-----------------------------------------------------
for(j = 0; j < num_chat; j++){
if(play == 1 && round1 == 0 && round1notice < num_chat){
char buy[100];
sprintf(buy, "\n%d번째 경매, 입찰가 입력 예) : 60, 기본소지금 : 100원", number);
send(clisock_list[j], buy, 200, 0);
round1notice = round1notice + 1;
}
}
if(play == 1 && round1 == 0){
if(buf[0] >= 48 && buf[0] <= 57){
round1chat = round1chat + 1;
c[i] = atoi(buf);
printf("\n입찰가(%d번 사람) : %d", i, c[i]);
}
if(round1chat == num_chat){
round1 = 1;
}
}
if(round1 == 1){
for(j = 0; j < num_chat; j++){
if(money[j] - c[j] < 0){
same = 0;
printf("\n소지금보다 많은 가격 입찰됨. 유찰!!\n");
for(k = 1; k < num_chat; k++){
send(clisock_list[0], "\n소지금보다 많은가격 입찰됨, 다시g키를 눌러 시작.", 100, 0);
send(clisock_list[k], "\n소지금보다 많은가격 입찰됨, 곧 다시시작됨", 100, 0);
}
break;
}
}
}
for(j = 0; j < num_chat; j++){ //경매후 높은가격입찰한사람
if(same == 0)
break;
if(round1 == 1){
if(c[j] > round1max){
round1max = c[j];
tmp = j;
}
else if(c[j] == round1max){
same = 0;
printf("\n같은가격 입찰됨. 유찰!!\n");
for(j = 1; j < num_chat; j++){
send(clisock_list[0], "\n같은 가격 입찰됨. 유찰!! 다시 g키를 눌러 시작.", 100, 0);
send(clisock_list[j], "\n같은 가격 입찰됨 곧 다시 시작됨 ", 100, 0);
}
break;
}
}
}
if(round1 == 1 && same == 1){
sprintf(save, "\n낙찰자 : %d, 낙찰금액 : %d", tmp, round1max);
printf("\n낙찰자 : %d, 낙찰금액 : %d\n", tmp, round1max);
money[tmp] = money[tmp] - round1max;
score[tmp] = score[tmp] + 1;
for(j = 0; j < num_chat; j++){
if(same == 0)
break;
send(clisock_list[j], save, 100, 0);
for(k = 0; k < num_chat; k++){
if(score[k] >= scoremax){
scoremax = score[k];
}
}
for(k = 0; k < num_chat; k++){
sprintf(result, "%d번 사람, 점수 : %d점", k, score[k]);
send(clisock_list[j], result, 100, 0);
}
printf("\n%d번 사람, 점수 : %d점", j, score[j]);
printf("\n%d번 사람, 남은 소지금 : %d점\n", j, money[j]);
sprintf(rmoney, "\n남은소지금 : %d", money[j]);
send(clisock_list[j], rmoney, 100, 0);
}
number = number + 1;
round1 = 0;
round1max = 0;
welcomecheck = 0;
play = 0;
round1chat = 0;
max = 0;
round1win = 0;
tmp = 0;
round1notice = 0;
scoremax = 0;
for(j = 0; j < num_chat; j++){
if(money[j] <= 0){
for(k = 0; k < num_chat; k++){
send(clisock_list[k], "\n끝", 100, 0);
}
}

if(score[j] >= winmax){
max = score[j];
winnum = j;
}
if(money[j] <= 0){
end = 0;
sprintf(win,"%d \n%d번 %d점으로 승리!!", winnum, max);
printf("\n%d번 %d점으로 승리!!\n", winnum, max);
for(k = 0; k < num_chat; k++){
send(clisock_list[k], win, 100, 0);
send(clisock_list[k], "q", 1, 0);
if(end == 0) break;
}
}
if(end == 0) break;
}
}
else if(same == 0){
number = number + 1;
round1 = 0;
round1max = 0;
welcomecheck = 0;
play = 0;
round1chat = 0;
max = 0;
round1win = 0;
tmp = 0;
round1notice = 0;
scoremax = 0;
same = 1;
for(k = 0; k < 100; k++){
c[k] = 0;
}
break;
}
if(end == 0) break;
}
if(end == 0) break;
}
}
< / code >

클라이언트\
< code >
#pragma comment(lib, "ws2_32")
#include
#include
#include
#include
#include
#include
#include
#include
#include
WSADATA wsaData;
#define MAXLINE 1000
#define NAME_LEN 20
char *EXIT_STRING = "exit";
int tcp_connect(int af, char *servip, unsigned short port);
void errquit(char *mesg){
perror(mesg);
exit(1);
}
int main(int argc, char *argv[]){
char bufall[MAXLINE+NAME_LEN], *bufmsg;
int maxfdp1, s, namelen;
fd_set read_fds;
if(argc != 4){
printf("사용법 : %s server_ip port name \n", argv[0]);
exit(0);
}
sprintf(bufall, "[%s] : ", argv[3]);
namelen = strlen(bufall);
bufmsg = bufall+namelen;
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) //윈속초기화
return 1;
s = tcp_connect(AF_INET, argv[1], atoi(argv[2]));

puts("서버에 접속되었습니다.");
maxfdp1 = s + 1;
FD_ZERO(&read_fds);
while(1){
FD_SET(0, &read_fds);
FD_SET(s, &read_fds);
select(maxfdp1, &read_fds, NULL, NULL, NULL);

if(FD_ISSET(s, &read_fds)){
int nbyte;
nbyte = recv(s, bufmsg, MAXLINE, 0);
bufmsg[nbyte] = 0;
printf("%s \n", bufmsg);
if(bufmsg[0] == 'q'){
puts("Good bye.");
_close(s);
exit(0);
}

}
if(FD_ISSET(0, &read_fds)){
if(fgets(bufmsg, MAXLINE, stdin)){
if(strstr(bufmsg, "g") != NULL){
send(s, "g", 1, 0);
}
else if(bufall[namelen] >= 48 && bufall[namelen] <= 57){
send(s, bufall + namelen, strlen(bufmsg), 0);
}

if(strstr(bufmsg, EXIT_STRING) != NULL){
puts("Good bye.");
_close(s);
exit(0);
}
}
}
}
}

int tcp_connect(int af, char *servip, unsigned short port){
struct sockaddr_in servaddr;
int s;
s=socket(af,SOCK_STREAM,0);

memset((char*)&servaddr,0,sizeof(servaddr));
servaddr.sin_family=af;
inet_pton(AF_INET,servip,&servaddr.sin_addr);
servaddr.sin_port=htons(port);
connect(s,(struct sockaddr*)&servaddr,sizeof(servaddr));

return s;
}
< / code >
혹시 해결해주실분있나요 ㅠㅠ

라스코니의 이미지

코드도 보기 어렵고, 뭐가 이상하다는지도 안 쓰여져 있고, 더군다나 어떤 기능을 요구하는 프로그램인지도 모르겠네요.

yksoo00의 이미지

서버코드입니다!!

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "ws2_32")
#define MAXLINE 511
#define MAX_SOCK 1024
#define _CRT_SECURE_NO_WARINGS
char *EXIT_STRING = "exit";
char *START_STRING = "Connected to chat_server \n";
int maxfdp1;
int listen_sock;
int same = 1;
int clisock_list[MAX_SOCK];
int welcomecheck = 0;
int play = 0;
int num_chat = 0;
int round1 = 0;
int round1max = 0;
int round1chat = 0;
int max = 0;
int round1win = 0;
int tmp = 0;
int winmax = 0;
int winnum = 0;
int round1notice = 0;
int score[100];
int scoremax = 0;
int money[100];
int number = 1;
int end = 1;
void addClient(int s, struct sockaddr_in *newcliaddr);
void removeClient(int);
int set_nonblock(int sockfd);
int is_nonblock(int sockfd);
int tcp_listen(int host, int port, int backlog);
WSADATA wsadata;

int is_nonblock(int sockfd){
int val;
u_long arg =1;
val = ioctlsocket(sockfd, FIONBIO, &arg);

return -1;
}

int set_nonblock(int sockfd){
int val;
u_long arg =1;
val = ioctlsocket(sockfd, FIONBIO,&arg );

return 0;
}
void errquit(char *mesg){
perror(mesg);
exit(1);
}
void addClient(int s, struct sockaddr_in *newcliaddr){
char buf[20];
inet_ntop(AF_INET, &newcliaddr -> sin_addr, buf, sizeof(buf));
printf("new client : %s\n", buf);

clisock_list[num_chat] = s;
num_chat++;
welcomecheck = 0;
}

void removeClient(int i){
_close(clisock_list[i]);
if(i != num_chat - 1)
clisock_list[i] = clisock_list[num_chat - 1];
num_chat--;
printf("채팅 참가자 1명 탈퇴. 현재 참가자 수 = %d\n", num_chat);
}

int tcp_listen(int host, int port, int backlog){
int sd;
struct sockaddr_in servaddr;

sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
perror("socket fail");
exit(1);
}
memset((char *)&servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(host);
servaddr.sin_port = htons(port);
if(bind(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
perror("bind fail"); exit(1);
}
listen(sd, backlog);
return sd;
}

int main(int argc, char *argv[]){
struct sockaddr_in cliaddr;
char buf[MAXLINE];
int i, j, k, nbyte, accp_sock, clilen, count;
int check = 1;
int rulecheck = 0;
int c[100];
char win[100];
char member[20];
char rules[100];
char playernum[100];
char save[100];
char result[100];
char rmoney[100];
char rule[] = "게임시작에 필요한 인원 2명 이상, 현재 : ";
for(k = 0; k < 100; k++){
score[k] = 0;
money[k] = 100;
}

for(k = 0; k < num_chat; k++){
c[k] = 0;
}

if(argc != 2){
printf("사용법 : %s port\n", argv[0]);
exit(0);
}
WSAStartup(MAKEWORD(2,2),&wsadata);
listen_sock = tcp_listen(INADDR_ANY, atoi(argv[1]), 5);

if(listen_sock == -1)
errquit("tcp_listen fail");
if(set_nonblock(listen_sock) == -1)
errquit("set_nonblock fail");
for(count = 0; ; count++){
if(count == 100000){
fflush(stdout);
count = 0;
}
clilen = sizeof(cliaddr);
accp_sock = accept(listen_sock, (struct sockaddr *)&cliaddr, &clilen);
if(accp_sock == -1)
errquit("accept fail");
if(accp_sock > 0){
clisock_list[num_chat] = accp_sock;
if(is_nonblock(accp_sock) != 0 && set_nonblock(accp_sock) < 0)
errquit("set_nonblock fail");
addClient(accp_sock, &cliaddr);
send(accp_sock, START_STRING, strlen(START_STRING), 0);
printf("%d번째 사용자 추가.\n", num_chat);
}
for(i = 0; i < num_chat; i++){
errno = 0;
if(welcomecheck == 0){ //처음으로 들어온사람에게 뿌려지는 메세지
welcomecheck = 1;

sprintf(rules, "g를 누르면 게임시작, 2명 이상필요 현재 %d명", num_chat);
send(clisock_list[i], rules, 100, 0);
}
nbyte = recv(clisock_list[i], buf, MAXLINE, 0);
if(nbyte == 0){
removeClient(i);
continue;
}
else if(nbyte == -1 && errno == EWOULDBLOCK)
continue;
if(strstr(buf, EXIT_STRING) != NULL){
removeClient(i);
continue;
}
check = strncmp(buf, "g", 1);
buf[nbyte] = 0;
if(num_chat >= 2 && check == 0){ //게임시작
for(j = 0; j < num_chat; j++){
send(clisock_list[j], "\n게임 시작", 20, 0);

sprintf(playernum, "\n%d번째 사람", j);
send(clisock_list[j], playernum, 20, 0);
}
play = 1;
}
else if(check == 0){ //게임시작 인원부족할 때
sprintf(member, "%d", num_chat);
if(rulecheck == 0){
strcat(rule, member);
strcat(rule, "명");
}
send(clisock_list[i], rule, 100, 0);
rulecheck = 1;
}
else{ //채팅
for(j = 0; j < num_chat; j++)
if((clisock_list[i] != clisock_list[j])){
if(buf[0] >= 48 && buf[0] <= 57){
}
else{
send(clisock_list[j], buf, nbyte, 0);
printf("%s\n", buf);
}
}
}
//게임시작-----------------------------------------------------
for(j = 0; j < num_chat; j++){
if(play == 1 && round1 == 0 && round1notice < num_chat){
char buy[100];
sprintf(buy, "\n%d번째 경매, 입찰가 입력 예) : 60, 기본소지금 : 100원", number);
send(clisock_list[j], buy, 200, 0);
round1notice = round1notice + 1;
}
}
if(play == 1 && round1 == 0){
if(buf[0] >= 48 && buf[0] <= 57){
round1chat = round1chat + 1;
c[i] = atoi(buf);
printf("\n입찰가(%d번 사람) : %d", i, c[i]);
}
if(round1chat == num_chat){
round1 = 1;
}
}
if(round1 == 1){
for(j = 0; j < num_chat; j++){
if(money[j] - c[j] < 0){
same = 0;
printf("\n소지금보다 많은 가격 입찰됨. 유찰!!\n");
for(k = 1; k < num_chat; k++){
send(clisock_list[0], "\n소지금보다 많은가격 입찰됨, 다시g키를 눌러 시작.", 100, 0);
send(clisock_list[k], "\n소지금보다 많은가격 입찰됨, 곧 다시시작됨", 100, 0);
}
break;
}
}
}
for(j = 0; j < num_chat; j++){ //경매후 높은가격입찰한사람
if(same == 0)
break;
if(round1 == 1){
if(c[j] > round1max){
round1max = c[j];
tmp = j;
}
else if(c[j] == round1max){
same = 0;
printf("\n같은가격 입찰됨. 유찰!!\n");
for(j = 1; j < num_chat; j++){
send(clisock_list[0], "\n같은 가격 입찰됨. 유찰!! 다시 g키를 눌러 시작.", 100, 0);
send(clisock_list[j], "\n같은 가격 입찰됨 곧 다시 시작됨 ", 100, 0);
}
break;
}
}
}
if(round1 == 1 && same == 1){
sprintf(save, "\n낙찰자 : %d, 낙찰금액 : %d", tmp, round1max);
printf("\n낙찰자 : %d, 낙찰금액 : %d\n", tmp, round1max);
money[tmp] = money[tmp] - round1max;
score[tmp] = score[tmp] + 1;
for(j = 0; j < num_chat; j++){
if(same == 0)
break;
send(clisock_list[j], save, 100, 0);
for(k = 0; k < num_chat; k++){
if(score[k] >= scoremax){
scoremax = score[k];
}
}
for(k = 0; k < num_chat; k++){
sprintf(result, "%d번 사람, 점수 : %d점", k, score[k]);
send(clisock_list[j], result, 100, 0);
}
printf("\n%d번 사람, 점수 : %d점", j, score[j]);
printf("\n%d번 사람, 남은 소지금 : %d점\n", j, money[j]);
sprintf(rmoney, "\n남은소지금 : %d", money[j]);
send(clisock_list[j], rmoney, 100, 0);
}
number = number + 1;
round1 = 0;
round1max = 0;
welcomecheck = 0;
play = 0;
round1chat = 0;
max = 0;
round1win = 0;
tmp = 0;
round1notice = 0;
scoremax = 0;
for(j = 0; j < num_chat; j++){
if(money[j] <= 0){
for(k = 0; k < num_chat; k++){
send(clisock_list[k], "\n끝", 100, 0);
}
}
winmax = 0;
winnum = 0;

if(score[j] >= winmax){
max = score[j];
winnum = j;
}
if(money[j] <= 0){
end = 0;
sprintf(win, "\n%d번 %d점으로 승리!!", winnum, max);
printf("\n%d번 %d점으로 승리!!\n", winnum, max);
for(k = 0; k < num_chat; k++){
send(clisock_list[k], win, 100, 0);
send(clisock_list[k], "q", 1, 0);
if(end == 0) break;
}
}
if(end == 0) break;
}
}
else if(same == 0){
number = number + 1;
round1 = 0;
round1max = 0;
welcomecheck = 0;
play = 0;
round1chat = 0;
max = 0;
round1win = 0;
tmp = 0;
round1notice = 0;
scoremax = 0;
same = 1;
for(k = 0; k < 100; k++){
c[k] = 0;
}
break;
}
if(end == 0) break;
}
if(end == 0) break;
}
}

여기서 accept함수에서 계속 accept fail이 출력됩니다 ㅠㅠㅠㅠㅠ

댓글 첨부 파일: 
첨부파일 크기
Image icon 1.png5.13 KB
yksoo00의 이미지

#pragma comment(lib, "ws2_32")
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define MAXLINE 1000
#define NAME_LEN 20
char *EXIT_STRING = "exit";
int tcp_connect(int af, char *servip, unsigned short port);
void errquit(char *mesg){
perror(mesg);
exit(1);
}
int tcp_connect(int af, char *servip, unsigned short port){
struct sockaddr_in servaddr;
int s;
if((s=socket(af,SOCK_STREAM,0))< 0)
return-1;
memset((char*)&servaddr,0,sizeof(servaddr));
servaddr.sin_family=af;
inet_pton(AF_INET,servip,&servaddr.sin_addr);
servaddr.sin_port=htons(port);
if(connect(s,(struct sockaddr*)&servaddr,sizeof(servaddr))< 0)
return-1;
return s;
}
int main(int argc, char *argv[]){
WSADATA wsadata;
char bufall[MAXLINE+NAME_LEN], *bufmsg;
int maxfdp1, s, namelen;
fd_set read_fds;
if(argc != 4){
printf("사용법 : %s server_ip port name \n", argv[0]);
exit(0);
}
sprintf(bufall, "[%s] : ", argv[3]);
namelen = strlen(bufall);
bufmsg = bufall+namelen;
WSAStartup(MAKEWORD(2,2),&wsadata);
s = tcp_connect(AF_INET, argv[1], atoi(argv[2]));
if(s == -1)
errquit("tcp_connect fail");
puts("서버에 접속되었습니다.");
maxfdp1 = s + 1;
FD_ZERO(&read_fds);
while(1){
FD_SET(0, &read_fds);
FD_SET(s, &read_fds);
if(select(maxfdp1, &read_fds, NULL, NULL, NULL) < 0)
errquit("select fail");
if(FD_ISSET(s, &read_fds)){
int nbyte;
if((nbyte = recv(s, bufmsg, MAXLINE, 0)) > 0){
bufmsg[nbyte] = 0;
printf("%s \n", bufmsg);
if(bufmsg[0] == 'q'){
puts("Good bye.");
close(s);
exit(0);
}
}
}
if(FD_ISSET(0, &read_fds)){
if(fgets(bufmsg, MAXLINE, stdin)){
if(strstr(bufmsg, "g") != NULL){
send(s, "g", 1, 0);
}
else if(bufall[namelen] >= 48 && bufall[namelen] <= 57){
send(s, bufall + namelen, strlen(bufmsg), 0);
}
else{
if(send(s, bufall, namelen+strlen(bufmsg), 0) < 0)
puts("Error : Write error on socket.");
}
if(strstr(bufmsg, EXIT_STRING) != NULL){
puts("Good bye.");
close(s);
exit(0);
}
}
}
}
}

여기서에서는 셀렉함수가 계속 select fail이 뜹니다 ㅠㅠ

라스코니의 이미지

코드는 < code > ~ < / code >
로 싸 주세요

yksoo00의 이미지

이렇게하는거 맞나요??

라스코니의 이미지

< code > < / code > 의 빈칸(space)을 없애고 붙여 넣어야죠.

익명 사용자의 이미지

1. 긴 코드
2. 디버그와 테스트가 번거로운 네트워크 프로그래밍
3. 개발자의 구체적이지 못한 상황 판단 (문제 인식이라곤 "계속 이상해진다" 뿐)

인터넷에서 무상으로 받을 수 있는 도움에는 한계가 있는 법이지요.
코드를 <code> 블럭으로 감싸면 읽기는 더 편해지기야 하겠지만,
과연 모든 문제가 해결될 때까지 도움을 주실 수 있는 분이 얼마나 계실지는 잘 모르겠네요.

오프라인에 아는 사람 없어요? 하다못해 밥이라도 한 번 사면서 도움을 구하셔야...

yksoo00의 이미지

제가 잘하지 못해서 인터넷에서 본거 배끼고 이러다보니까 어디가 정확하게 오류다는 모르겠고 특정함수에서 이상이 있는것만 알고있습니다 ㅠㅠ

익명 사용자의 이미지

대학생이면 얘기가 더 쉽군요.

교과 담당 조교님 안 계신가요? 찾아가서 질문하세요.
대학은 바로 그런 도움을 제공하기 때문에 등록금을 내고 다니는 것입니다.

라스코니의 이미지

음.. 좀 추적을 해보니 (^^;;) 인터넷에서 참고한 소스는 https://ddingz.tistory.com/m/256 에서 가져오신 것 같고, 거기서부터 뭔가를 수정하셨군요.

무엇을 수정했는데 한번 다시 복기해 보세요. 특히 accept()를 호출한 코드를 어떻게 바꾸었는지, 정확히 알고 바꾸었는지 다시 생각해 보세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.