Linux에서 C 프로그래밍을 처음 사용하기 때문에 서버를 만들려고합니다. 나는 accept 메소드를 켰다. 클라이언트가 연결을 시도했지만 아무 일도 일어나지 않았습니다! 나는 이유를 모른다. 나를 도와주고 싶니?내 서버가 왜 동의하지 않습니까?
서버 측 :
int main(int argc, char *argv[])
{
int len,err,port;
if(argc != 2) {
exit(1);
}
initSem();
port = atoi(argv[1]);
initSocket(port);
printf("server fd: %d.\n", serverFd);
len = sizeof(struct sockaddr_in);
printf("len: %d\n",len);
clientsFd[counterThread] = accept(serverFd,
(struct sockaddr*)&clientsAddress[counterThread],
(socklen_t*)&len);
printf("new client:: %d", clientsFd[counterThread]);
if(clientsFd[counterThread] == -1) {
perror("can't connect to new client.");
exit(1);
}
return 0;
}
void initSocket(int port)
{
erverFd = socket(AF_INET, SOCK_STREAM, 0);
serverAdrees rees.sin_addr.s_addr = INADDR_ANY;
serverAdrees.sin_port = htons(port);
bind(serverFd, (struct sockaddr*)&serverAdrees, (socklen_t)sizeof(struct sockaddr_in));
listen(serverFd, MAX_CLIENTS);
}
클라이언트 측 :
int main(int argc, char *argv[])
{
int err,len,port;
struct sockaddr_in serverAddr;
char massageBuf[MAX_MASSAGE];
pthread_t readThread;
if(argc != 3) {
perror("no arguments..\n");
return 1;
}
if((serverFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("\n Error : Could not create socket \n");
return 1;
}
printf("server fd: %d.\n", serverFd);
serverAddr.sin_family = AF_INET;
port = atoi(argv[2]);
serverAddr.sin_port = htons(port);
printf("addr: %s .\n", argv[1]);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("before connect\n");
if(connect(serverFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
{
perror("\n Error : Connect Failed \n");
return 1;
}
printf("after connect \n");
while (1) {
scanf("%s", massageBuf);
printf("%s \n", massageBuf);
if(-1 == write(serverFd, massageBuf, strlen(massageBuf))) {
perror("\n Error : write to server Failed \n");
return 1;
}
if(!strcmp(massageBuf,"close")) {
exit(1);
return 0;
모든 소켓 관련 시스템 호출 (socket, bind, listen, accept, connect)의 결과를 확인해야합니다. 그러면 어느 것이 실패하는지 알 수 있습니다. (아마도'bind '는'ServerAddress' 구조체를 제로로 만들지 않았기 때문에 실패 할 수도 있고 포트가 바쁜 것일 수도 있습니다.) 리눅스에서 계속 프로그래밍을 할 계획이라면 원칙적으로 받아 들여야합니다 : 항상 시스템의 결과를 확인하십시오 또는 어떤 식 으로든 실패 할 수있는 라이브러리 함수 (물론'printf'의 결과를 확인하는 것을 권장하지 않지만 대부분은 검사해야합니다). – Inspired
코드를 들여 쓰기가 가능하도록하십시오. 그런 다음 문제를 나타내는 ** 간단한 코드 **로 줄이십시오. –