소켓 클라이언드 connect에서 자꾸 에러가 납니다 ㅠㅠ
글쓴이: pos06083 / 작성시간: 월, 2022/03/21 - 6:31오후
안녕하세요 최근 c언어로 소켓프로그래밍을 이용해 공부하며 클라이언트 프로그램 만들고 있습니다.
문제는 클라이언트랑 서버는 이더넷으로 연결 해뒀는데 이더넷 선이 뽑혀도 대기하고있다가 선이 연결되면 다시 재접속되게 하려는데 connect API에서 자꾸 에러가 납니다.
인자가 잘못 전달 되는거같기는 한데 Address family not supported by protocol에러가 발생합니다.
아직 공부중이라 코드에 문제가 많을 수 있음 감안하고 봐주세요 ㅠㅠ
여기는 main 부분입니다.
struct sockaddr_in serv_addr; char message[256]; FILE* file = NULL; char fname[100]; signal(SIGPIPE, SIG_IGN); if(argc != 3) { printf("Usage : %s <IP>, <PORT> \n", argv[0]); exit(1); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=inet_addr(INADDR); serv_addr.sin_port=htons(PORTNUM); printf("+++++++++++++++++++Main addr : %d\n", serv_addr.sin_addr.s_addr); sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == -1) error_handling("socket() error"); //connect sc.csock = sock; sc.addr = (struct sockaddr_in *)&serv_addr; if(pthread_create(&Con_Thread, NULL, connect_task, (void *)&sc) != 0) { puts("Connect_Thread create error\n"); return -1; } . . . . . .
connect thread
void* connect_task(void* data) { pthread_t tid; tid = pthread_self(); printf("[connect thread] tid : %x\n", (unsigned int)tid); //data 전달 sock_c* sc = (sock_c*) data; int sock = sc->csock; struct sockaddr_in *adr = sc->addr; printf("+++++++++++++++++++connect_task addr : %d\n", adr->sin_addr.s_addr); connect_check(sock, adr); int state; while(1) { net_interface(); state = socket(AF_INET, SOCK_STREAM, 0); if(link_net == 0) { if( state == 0) { //state = 1; connect_check(sock, adr); usleep(100); } else if (state != 0) { sock = socket(AF_INET, SOCK_STREAM, 0); memset(adr, 0, sizeof(adr)); adr->sin_family=AF_INET; adr->sin_addr.s_addr=inet_addr(INADDR); adr->sin_port=htons(PORTNUM); if(cresult == -1) { //connect connect_check(sock, adr); usleep(100); } } } else { //printf("link_net ==1 >> [ linkconnect]\n"); printf("state : %d\n", state); usleep(100); //break; } }
실제 connect api 사용 부분입니다.
if(connect(sockfd, (struct sockaddr*)&addr, sizeof((struct sockaddr*)&addr)) < 0) { printf("+++++++++++++++++++connect_check addr : %d\n", addr->sin_addr.s_addr); printf("connect -> %d[%s]\n", errno, strerror(errno)); if(errno != EINPROGRESS) { fputs("connected error()\n", stderr); fputc('\n', stderr); //return -1; } } FD_ZERO(&r_set); FD_SET(sockfd, &r_set); tv.tv_sec = TIMEOUT; tv.tv_usec = 0; if(select(sockfd+1, &r_set, NULL, NULL, &tv) == -1) { errno = ETIMEDOUT; printf("select error\n"); printf("select -> %d[%s]", errno, strerror(errno)); close(sock); }
Forums:
댓글 달기