Ошибка в привязке сокета к протоколу UDP

#c #sockets

#c #сокеты

Вопрос:

Я новичок в программировании сокетов с использованием C. Я нашел учебное пособие, которому следовал, но при запуске серверного кода я получаю ошибку в привязке сокета. Оператор print printf("*** SERVER ERROR: Could not bind socket.n"); запускается в приведенном ниже коде UDP-сервера, и я не уверен, в чем проблема.

КОД СЕРВЕРА UDP

 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_PORT 6000

int main() {

int serverSocket;

struct sockaddr_in serverAddr, clientAddr;

int status, addrSize, bytesReceived;

fd_set readfds, writefds;

char buffer[30];

char *response = "OK";

// Create the server socket serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (serverSocket < 0) {
    printf("*** SERVER ERROR: Could not open socket.n");
    exit(-1);
}
// Setup the server address
memset(amp;serverAddr, 0, sizeof(serverAddr)); // zeros the struct
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons((unsigned short) SERVER_PORT);
// Bind the server socket
status = bind(serverSocket,(struct sockaddr *)amp;serverAddr, sizeof(serverAddr));

if (status < 0) {
    printf("*** SERVER ERROR: Could not bind socket.n");
    exit(-1);
}
// Wait for clients now
while (1) {
    FD_ZERO(amp;readfds);
    FD_SET(serverSocket, amp;readfds);
    FD_ZERO(amp;writefds);
    FD_SET(serverSocket, amp;writefds); status = select(FD_SETSIZE, amp;readfds, amp;writefds, NULL, NULL);
    if (status == 0) { // Timeout occurred, no client ready
    }
    else if (status < 0) {
        printf("*** SERVER ERROR: Could not select socket.n");
        exit(-1);
    }
    else {
        addrSize = sizeof(clientAddr); bytesReceived = recvfrom(serverSocket, buffer, sizeof(buffer),
        0, (struct sockaddr *) amp;clientAddr, amp;addrSize);
        if (bytesReceived > 0) {
            buffer[bytesReceived] = '';
            printf("SERVER: Received client request: %sn", buffer);
        }
        // Respond with an "OK" message
        printf("SERVER: Sending "%s" to clientn", response);
        sendto(serverSocket, response, strlen(response), 0, (struct sockaddr *) amp;clientAddr, addrSize);
        // If the client said to stop, then I'll stop myself
        if (strcmp(buffer, "stop") == 0)
        break;
    }
}
}
 

КОД КЛИЕНТА UDP

 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 6000
int main() {
int clientSocket, addrSize, bytesReceived;

struct sockaddr_in serverAddr;
char inStr[80]; // stores user input from keyboard
char buffer[80]; // stores sent and received data
// Create socket 
clientSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (clientSocket < 0) {
    printf("*** CLIENT ERROR: Could open socket.n");
    exit(-1);
}
// Setup address
memset(amp;serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons((unsigned short) SERVER_PORT);
// Go into loop to commuincate with server now
while (1) {
    addrSize = sizeof(serverAddr);
    // Get a command from the user
    printf("CLIENT: Enter command to send to server ... ");
    scanf("%s", inStr);
    // Send command string to server
    strcpy(buffer, inStr);
    printf("CLIENT: Sending "%s" to server.n", buffer);
    sendto(clientSocket, buffer, strlen(buffer), 0, (struct sockaddr *) amp;serverAddr, addrSize);
    // Get response from server, should be "OK" 
    bytesReceived = recvfrom(clientSocket, buffer, 80, 0,(struct sockaddr *) amp;serverAddr, amp;addrSize);
    buffer[bytesReceived] = 0; // put a 0 at the end so we can display the string
    printf("CLIENT: Got back response "%s" from server.n", buffer);
    
    if ((strcmp(inStr,"done") == 0) || (strcmp(inStr,"stop") == 0))
        break;
    }
    close(clientSocket); // Don't forget to close the socket !
    printf("CLIENT: Shutting down.n");
}
 

Комментарии:

1. Пожалуйста, используйте perror , чтобы показать фактическую причину сбоя, а не просто указать, что произошел сбой.

2. // Create the server socket serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); Код не работает, если он закомментирован. Вы не создали сокет, поэтому, конечно, вы не можете его привязать.

3. Точно, как вы хотите отправить сокет, если вы его не создаете! У вас есть проверка, но вы прокомментировали строку, которая создаст сокет! Вам нужно иметь эту строку serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); на стороне клиента, она у вас есть!

4. спасибо @kaylum. Вот и все, теперь это работает.