2

Cで小さなUDPサーバー/クライアントアプリケーションを実装しようとしていますが、サーバー側で2つのエラーが発生しました: recvfrom:不正なアドレス&& sendto:プロトコルでサポートされていないアドレスファミリ。私は間違いを検索して答えをグーグルで検索しましたが、残念ながら、それらはあまり役に立ちませんでした...多分私は間違った方法でパラメータをキャストしていて、それを取得していません。ヒントを教えていただければ幸いです:)。

#include <unistd.h>
#include <ctype.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>

#define BUFFSIZE 256
#define IP "127.0.0.1"
#define PORT 7755

int main(void){

  int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
  char buffer[1] = "s";

  struct sockaddr_in src_addr;
  struct sockaddr_in dest_addr;

  src_addr.sin_family = AF_INET;
  src_addr.sin_port = htons(PORT);
  src_addr.sin_addr.s_addr = inet_addr(IP);

  if(socket_fd==-1)
    perror("socket");

  if(bind(socket_fd, (struct sockaddr*)&src_addr, sizeof(src_addr))==-1)
    perror("bind");

  if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, (unsigned int *)sizeof(struct sockaddr_in))==-1)
    perror("recvfrom");

  if(sendto(socket_fd, buffer, 2, 0,(struct sockaddr*)&dest_addr, sizeof(dest_addr))==-1)
    perror("sendto");

  if(close(socket_fd)==-1)
    perror("close");

  return 0;

}
4

2 に答える 2

12

recvfromに有効なポインタを渡す必要があります。(unsigned int *)sizeof(struct sockaddr_in)は有効なポインタではありません。

変化する

 if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, 
             (unsigned int *)sizeof(struct sockaddr_in) == -1)

例えば

 socklen_t len = sizeof dest_addr;
 if(recvfrom(socket_fd, buffer, 2, 0, 
             (struct sockaddr*)&dest_addr, &len) == -1)

また、送信する無効な配列を作成しています。配列の長さは1ですが、sendto / recvfromに長さが2であることを通知します。したがって、次のように変更します。

char buffer[1] = "s";

char buffer[] = "s";

(文字列「s」は文字「s」と0バイトであるためbuffer、後者の場合は長さが2になります。)

于 2012-12-16T03:00:28.817 に答える
0

recv/recvmsg/recvメインページからのFedora18Betaからの引用:

ssize_t recv(int sockfd, void *buf, size_t len, int flgags);  
ssize_t recvfrom(int sockfd, void*buf, size_t len, int flags,  
       struct sockaddr *src_addr, socklen_t* addrlen); 

recvfrom以下から調整する必要があります:

   recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, 
             (unsigned int *)sizeof(struct sockaddr_in) == -1)

に:

   recvfrom (socket_fd, buffer, sizeof(buffer), 0, 
            (struct sockaddr*)&dest_addr, &addrlen);
  • 初期化しないでくださいdest_addr
  • 配列(eg _buffer_)は常にポインタ型です
  • 本番プログラムでは、バッファをはるかに大きくする(動的なサイズにする)必要があります。そうしないと、バッファの固定サイズがスタックスマッシング(セキュリティホール)のターゲットになります。
于 2012-12-16T03:44:33.823 に答える