2015-10-09 116 views
0

我想以非常簡單/基本的方式在C中實現UDP套接字。我的程序是爲了在終端之間發送/接收文件,每個程序運行一個程序。我在客戶端代碼中遇到了sendto()函數的問題。這裏是我的代碼:C - Sendto()中的UDP套接字發送失敗:無效參數

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include<arpa/inet.h> 
#include<sys/socket.h> 
#include <errno.h> 

#define BUFFER_SIZE 512 

int main(int argc, char *argv[]) 
{ 
    struct sockaddr_in client; 
    int sockfd, bytes, errno, slen = sizeof(client); 
    char buffer[BUFFER_SIZE]; 

    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 

    if(sockfd == -1) 
    { 
     perror("Socket creation failed."); 
     return 0; 
    } 

    client.sin_addr.s_addr = INADDR_ANY; 
    client.sin_family = AF_INET; 
    client.sin_port = htons(0); 

    if(bind(sockfd, (struct sockaddr *)&client, sizeof(client)) == -1) 
    { 
     perror("Bind call failed."); 
     return 0; 
    } 

    while(1) 
    { 
     printf("Enter message : "); 
     fgets(buffer, BUFFER_SIZE, stdin); 

     printf("Message: %s\n", buffer); 
     bytes = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&client, sizeof(client)); 

     printf("Bytes: %d\n", bytes); 

     if(bytes == -1) 
     { 
      printf("Error number: %d", errno); 
      perror("Send failed."); 
      return 0; 
     } 

     memset(buffer,'\0', BUFFER_SIZE); 

     if(recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client, &slen) == -1) 
     { 
      perror("Recieve failed."); 
      return 0; 
     } 

     puts(buffer); 
    } 

    close(sockfd); 

    return 0; 
} 

無論我進入緩衝區,我總是從sendto()中得到錯誤號碼22爲無效參數。我已經嘗試了我遇到的每個解決方案或調整,但似乎沒有任何工作。

+1

您正在嘗試發送到端口0,這是無效的。 – Barmar

+0

你爲什麼想要發送到客戶地址?如果這是客戶端代碼,它應該發送到服務器的地址。 – Barmar

+0

如果端口無效,綁定也會失敗嗎?如果我嘗試將端口設置爲與服務器相同的端口,它將無法運行,因爲服務器已在使用該端口並且綁定失敗。另外,因爲它只是在本地主機上發送,我相信兩個地址是相同的?我可能是錯的。我是新來的socket – bibzuda7

回答

2

只需添加這一段代碼綁定後()

getsockname(sockfd, (struct sockaddr *)&client, &slen); 

手冊頁

DESCRIPTION 
    The getsockname() function returns the current address for the specified 
    socket. 

    The address_len parameter should be initialized to indicate the amount of 
    space pointed to by address. On return it contains the actual size of 
    the address returned (in bytes). 

    The address is truncated if the buffer provided is too small. 

RETURN VALUES 
    The getsockname() function returns the value 0 if successful; otherwise 
    the value -1 is returned and the global variable errno is set to indicate 
    the error. 
+0

@EJP從他看起來他想發送數據包回到他正在監聽的同一個端口。如果是這種情況,這將解決它。他說這是「無效論點」,而不是分段錯誤。 – WalterM

+0

是啊哎呀錯誤的線程;-( – EJP

相關問題