Я реализую UDP-сервер и клиент на C. В основном я занимаюсь программированием сокетов в Linux.
Клиентская программа останавливается, когда пользователь вводит 'q', и я хочу остановить серверную программузатем также.
Таким образом, моя серверная программа получает пакет со значением 'q' и, используя strcmp()
, решает, остановится он или нет.
Но возвращаемое значение strcmp()
на стороне сервера - 100, когда полученное сообщение - 'q'. В клиентской программе, если пользователь вводит «q», возвращаемое значение strcmp равно «0». Поэтому я не могу использовать strcmp()
так же, как серверную программу.
Я изменил сторону сервера, чтобы она могла остановиться, когда возвращаемое значение strcmp()
равно 100, но я не думаю, что этоверно ..
Вы можете мне помочь?
Это серверная часть "UDPserver.c"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
void error_handling(char *message);
int main(int argc, char **argv) {
int BUFSIZE= atoi(argv[2]);
int serv_sock;
char message[BUFSIZE];
int str_len;
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
int clnt_addr_size;
if (argc != 3) {
printf("Usage : &s &s <port> <buffersize>\n", argv[0]);
exit(1);
}
serv_sock=socket(PF_INET, SOCK_DGRAM, 0);
if (serv_sock == -1)
error_handling("UDP 소켓 생성 오류");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)
error_handling("bind() error");
sleep(5);
while ((str_len = recvfrom(serv_sock, message, BUFSIZE, 0, (struct sockaddr*)&clnt_addr, &clnt_addr_size)) != 0) {
printf("strcmp %d\n", strcmp(message, "q\n"));
if (strcmp(message, "q\n") == 100)
break;
write(1, message, str_len);
}
return 0;
}
void error_handling(char *message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
Это клиентская сторона "UDPclient.c"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUFSIZE 30
void error_handling(char *message);
int main(int argc, char **argv) {
int sock;
char message[BUFSIZE];
int str_len, addr_size, i;
char MSG1[] = "0123456789";
char MSG2[] = "ABCDEFGHIJ";
char MSG3[] = "KLMNOPQRST";
struct sockaddr_in serv_addr;
struct sockaddr_in from_addr;
if (argc != 3) {
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock == -1)
error_handling("UDP 소켓 오류 생성");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
sendto(sock, MSG1, strlen(MSG1), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
sendto(sock, MSG2, strlen(MSG2), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
sendto(sock, MSG3, strlen(MSG3), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
while(1) {
/* 메시지 입력 전송*/
fputs("type in a message (q to quit) : ", stdout); // print
fgets(message, BUFSIZE, stdin); // scanf, save what u type in to message
sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // write->send 로
printf("strcmp %d\n", strcmp(message, "q\n"));
if (!strcmp(message, "q\n")) // if the input is q, stop
break;
}
close(sock);
return 0;
}
void error_handling(char *message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
EDIT
Это то, что я изменил на стороне сервера.
while ((str_len = recvfrom(serv_sock, message, BUFSIZE, 0, (struct sockaddr*)&clnt_addr, &clnt_addr_size)) != 0) {
message[str_len] = 0;
if (!strcmp(message, "q\n"))
break;
write(1, message, str_len);
}