2016-12-18 3 views
1

sendを使用して1つの1バイト値を送信しようとしましたが、失敗しようとしたときにerrnoEFAULTに設定しました。なぜ私はbuf引数をcharのアドレスに設定しているのか分かりません。EFAULT charを送信しようとしました

#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <string.h> 
#include <netinet/ip.h> 
#include <netinet/tcp.h> 
#include <unistd.h> 

#define INVALID_SOCKET ~0 

int main() 
{ 
    int s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 
    struct sockaddr_in sin = {0}; 
    char C0 = 3; 

    if(s == INVALID_SOCKET){exit(1);} 

    sin.sin_addr.s_addr = inet_addr(/*ip*/); 
    sin.sin_port  = htons(1935); 
    sin.sin_family  = AF_INET; 

    printf("Destination IP: %s\n", inet_ntoa(sin.sin_addr)); 
    printf("Destination Port: %u\n", ntohs(sin.sin_port)); 

    if(connect(s, (struct sockaddr*)&sin, sizeof(sin)) == -1){printf("Errno: %d\n", errno);exit(2);} 

    if(send(s, &C0, 1, 0) == -1) 
    { 
     switch(errno) 
     { 
      case EFAULT: 
      { 
       printf("Error: Invalid memory address\nExiting\n"); 
       close(s); 
       exit(3); 
       break; 
      } 
      default: 
      { 
       printf("Error: %d\nExiting\n", errno); 
       close(s); 
       exit(3); 
       break; 
      } 
     } 
    } 

    return 0; 
} 
+0

関連しないメモでは、実際には 'connect'呼び出しに間違ったサイズを渡します。これは、実際に使用するソケットアドレス構造のサイズでなければなりません。 –

+0

おそらくもっと関連するノートでは、 'sin'構造全体をクリアするべきでしょう。例えばのように。 'struct sockaddr_in sin = {0};' –

+0

@Someprogrammerdude注目されています。ありがとうございました! –

答えて

0

問題は、あなたがソケットを作成しているということです。つまり、完全なIPパケットをゼロから作成して送信しなければならないということです。

定義されていない動作sendコールとして発生し、基になるネットワークスタックが、指定した1バイトを超えてデータを読み取ることができなくなります。

+0

私はこれを考えなかったとは思えません。私は時には 'EINVAL'または' EFAULT'をなぜ返すのか不思議でした。しかし、今私は理解していると思う。 RTMPハンドシェイクを開始しようとしています。これはC1が必要であることを知っています。何らかの理由で私はIPヘッダーを完全に忘れてしまいました。 –

関連する問題