質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • C#

    7445questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3825questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • ネットワーク

    547questions

    ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

  • Win32 API

    226questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

  • TCP

    167questions

    TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

C言語Winsock2 TCPで外部通信ができません

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,331

yukkyooooo

score 4

サーバ用 server.c
#include <stdio.h>
#include <winsock2.h>

#define debug

//関数宣言 プロトタイプ宣言
void sessionTCP(int sv_port);

void main(void){

    int sv_port = 34000;
    sessionTCP(sv_port);

}

//接続用 TCP
void sessionTCP(int sv_port){

    int err_ws;

    SOCKET sock_s;
    SOCKET sock_c;
    
    struct sockaddr_in addr;
    struct sockaddr_in client;
    
    BOOL yes = 1;
    
    WSADATA ws;
    err_ws=WSAStartup(MAKEWORD(2,0),&ws);
    if(err_ws != 0){
        exit(1);
    }
    
    sock_s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (sock_s == INVALID_SOCKET){   
                printf("socket : %d\n", WSAGetLastError());
    }
    addr.sin_family = AF_INET;
    addr.sin_port = htons(sv_port);
    //addr.sin_addr.S_un.S_addr = INADDR_BROADCAST;
    addr.sin_addr.S_un.S_addr = INADDR_ANY;
    
    setsockopt(sock_s,SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes));
    
    #ifdef debug
    printf("bind start...\n");
    #endif
    if(bind(sock_s,(struct sockaddr *)&addr,sizeof(addr))!=0){
        printf("bind error\n");
    }
    #ifdef debug
    printf("listen start...\n");
    #endif
    listen(sock_s, 5);
    int sock_s_len=sizeof(client);
    char revcmd[100];
    while(1){
            #ifdef debug
            printf("accept start...");
            #endif
            sock_c = accept(sock_s, (struct sockaddr *)&client,&sock_s_len);
            
            printf("IP:%s PORT:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
            scanf("%s",revcmd);
            send(sock_c,revcmd,sizeof(revcmd), 0);
            closesocket(sock_c);
    }
    WSACleanup();
}

クライアント用 client.c
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>

#define debug

void sessionTCPstart(char *IPAddress,int port);

int main(){
char ip[]="xxx.xxx.xxx.xxx";
 int port=34000;
 
sessionTCPstart(ip,port);

 return 0;
}
void sessionTCPstart(char *IPAddress,int port){

    char ip[16];
    strcpy(ip,IPAddress);

    WSADATA wsaData;
    struct sockaddr_in server;
    SOCKET sock;
    char cmd[256];
    WSAStartup(MAKEWORD(2,0), &wsaData);
 
while(1){
    #ifdef debug
    printf("connect start...\n");
    #endif

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET){
        printf("ソケットエラー\n");
    }
    
     server.sin_family = AF_INET;
     server.sin_port = htons(port);
     server.sin_addr.S_un.S_addr = inet_addr(ip);
    
    if(connect(sock, (struct sockaddr *)&server, sizeof(server))){
        printf("connect error\n");
    }
    memset(cmd, 0, sizeof(cmd));
    int n = recv(sock, cmd, sizeof(cmd), 0);
    printf("%s",cmd);
    if(strcmp(cmd,"-exit")==0){
        exit(1);
    }
    closesocket(sock);
}
 WSACleanup();

}


コンパイラはGCCを使用しております。
「gcc -lwsock32 server.c -lws2_32 -o server -m32」
「gcc -lwsock32 client.c -lws2_32 -o client -m32」
でコンパイルしています。

ローカルIPでは問題なく通信できました。
グローバルIPでやろうとするとまったく通信ができないです。
CONNECTに失敗します。ルータでポート転送設定はしており、サーバ設置PC
ではESETのセキュリティソフトを使用しておりますがそちらもポートを空けて
おります。それでも通信ができません。

どうすれば通信できますか。
お力をお貸しください。

NOTEPAD+で開発しております。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kiri

    2015/08/07 04:19

    WSAGetLastErrorを使ってconnectのエラーコードを確認していただけますでしょうか? printf("connect error: %d\n", WSAGetLastError());

    キャンセル

  • coco_bauer

    2015/08/07 18:43

    質問です > ローカルIPでは問題なく通信できました。 > グローバルIPでやろうとするとまったく通信ができないです。 と書かれているのですが、これは 「 サーバとクライアントが同一のローカルネットワーク(LAN)に接続している場合は動作するが、 クラウド等の(自宅に置いていない)サーバでサーバ用プログラムを起動しておいて、それを自宅の クライアントから接続しようとすると接続できない。」 という事ですか? 状況が判るように、もう少し詳しく説明してください。

    キャンセル

  • yukkyooooo

    2015/08/07 18:55 編集

    >kiriさん connectのエラーのところで if(connect(sock, (struct sockaddr *)&server, sizeof(server))){ printf("connect error: %d\n", WSAGetLastError()); } でエラー「connect error: 10060」と出ました

    キャンセル

  • yukkyooooo

    2015/08/07 19:18

    >coco_bauer 外部ネットワークからアクセスするユーザはクライアント.exeを渡します。サーバは自宅に置きます。それでやってみたらできませんでした。addr.sin_addr.S_un.S_addr = INADDR_ANY;以外にもINADDR_BROADCASTやほかを試しても同様でした。またなぜかINADDR_ANY以外に設定して動作確認すると、サーバのほうに知らないIPが表示されます。 「142.17.63.117 PORT:0」と表示されます。カナダから接続されているようなんですが、これは何のIPかわかりますか?Wireshackなどで見てもわかりませんでした。別途で質問となるんですが回答いただければ助かります。

    キャンセル

回答 1

check解決した方法

0

ESETのFWの設定でなぜかはじかれていたようです。
別WINDOWS7(Windows Defender)ではグローバルIP指定での通信が可能でした。
またセグメントが違う機器間でも通信できました。ESETが原因でした

サーバを設置しているほうのESETのFWを無効にした瞬間からつなげたので、
今回はFWが原因でした。

お騒がせしました。回答くださった2名の方ありがとうございます。
おかげで原因究明ができました

ちなみに今回試したこと
・自宅ローカル内 セグメントが異なる
CATVモデム==バファロルタ(IP:ClassC)=|=necルタ(IP:ClassA)
  ∟Share用サーバ(ClassC .5 ∟MainPC(ClassA .2)
・グローバル
クライアント側ー>Internetー>CATVモデム=以下略 ->Mainpc(サーバ設置)


以上

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • C#

    7445questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3825questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • ネットワーク

    547questions

    ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

  • Win32 API

    226questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

  • TCP

    167questions

    TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。