Я довольно новичок в C & Linux, и я попытался настроить сервер сокетов TCP для обмена данными с C-кодом, который я скомпилировал и выполнил в системе Ubuntu.
Из учебника я скопировал следующеекод (см. ниже, оригинальная версия не включала обработку исключений), и он работал для запуска сервера и получения данных (время и дата) с клиентским кодом (на той же машине для целей тестирования).
Затем я перезапустил машину с Ubuntu и с тех пор не могу больше запускать сервер.
Затем я добавил обработку кода к приведенному ниже коду, и он выдает «невозможно связать» с ошибкой 22, что означает «недопустимый аргумент»? Это не имеет смысла для меня, так как тот же самый код работал раньше довольно хорошо.
Я предполагал, что "старый" сокет находится в состоянии ожидания времени или еще не закрыт, но я проверил все соединения с"ss -all state xxx" для всех разных состояний, и все кажется в порядке.
Также пытался использовать разные порты и коды - та же проблема.
Надеюсь, что любой может помочь мне с этой проблемой, так как яне знаю, что еще попробовать.
// C-Code Server
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
char sendBuff[1025];
time_t ticks;
//Open a socket
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));
if (listenfd == -1) {
printf("Error: unable to open a socket\n");
exit(1);
}
//Create an Adress
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htons(INADDR_ANY);
serv_addr.sin_port = htons(1234);
//Macht schon benutzte Adresse mit SO_REUSEADDR nutzbar
int opt = 1;
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))<0) {
perror("setsockopt");exit(EXIT_FAILURE);
}
if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(opt))<0) {
perror("setsockopt");exit(EXIT_FAILURE);
}
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if ((bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) == -1) {
printf("Error: unable to bind\n");
printf("Error code: %d\n", errno);
exit(1);
}
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
if (connfd == -1) {
printf("Error: unable to accept connections\n");
printf("Error code: %d\n", errno);
exit(1);
}
ticks = time(NULL);
snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
write(connfd, sendBuff, strlen(sendBuff));
close(connfd);
sleep(1);
}
}